El framework Kohana PHP, aparte de poseer un interesante y muy completo ORM, tiene otra opción que nos permite mejorar nuestras consultas a la base de datos.
Este se llama QueryBuilder, el cual como su nombre lo indica es un constructor de consultas.
En el post anterior, comente como usar el ORM de kohana, el cual como vemos nos ahorra mucho trabajo y nos permite hacer consultas complejas mediante el uso de la orientación a objetos, sin embargo no todo es tan maravilloso como suena, una de las cosas mas contraproducentes que tiene este y la mayoría de ORM’s es la siguiente.
Ejemplo de lo que sucede al hacer una consulta usando el ORM
//Consulta ORM
$result = ORM::factory('users')->find_all();
//Consulta generada
$sql = 'select * from users';
Como vemos por default, nos esta haciendo un select *, esta consulta puede afectar seriamente nuestro rendimiento cuando nuestra tabla contiene muchos registro o muchos campos, además de que cuando tenemos tablas con un campo ambiguo, hacer funcionar bien el ORM puede darnos varios dolores de cabeza.
Los desarrolladores de kohana, antes de lanzar el ORM, crearon un constructor de consultas, el cual nos da toda la potencia de el lenguaje SQL, pero usando técnicas de orientación a objetos usando PHP.
Para usarla lo haremos configurando todo lo necesario como lo hicimos en el post anterior, y crearemos los querys de la siguiente forma.
* Uso de método estático DB::query()
//Sintaxis
$query = DB::query(integer $type,String $sql);
Esta es una de las herramientas mas completas que tenemos dentro del QueryBuilder, básicamente es un método estático en donde recibe dos parámetros, el primero de tipo integer que en realidad es una constante de la clase Database, en donde le indicamos que tipo de consulta haremos( select, delete, insert, update), veamos su equivalencia.
Database::SELECT; // corresponde a 1
Database::INSERT; // corresponde a 2
Database::UPDATE; // corresponde a 3
Database::DELETE; // corresponde a 4
El segundo parámetro es string donde indicamos la consulta que necesitemos hacer la cual puede incluir algunas variables las cuales estarán indicadas mediante dos puntos y el nombre de variable, el cual no tiene nada que ver con las variables de PHP, y posteriormente se le puede indicar el valor de dicha variable mediante el método param, parameters o bind.
Veamos como quedaría una consulta normal
$user = 'ajaxman';
//Nótese la variable :user
$query = DB::query(Database::SELECT, 'SELECT id,username FROM users WHERE username = :user');
//Asignación de la variable :user a variable PHP $user.
$query->param(':user',$user);
/*** Ejemplo de como seria en modo normal de PHP y MySQL ***/
$query = 'SELECT id,username FROM users WHERE username = '.$user;
Pero aun no tenemos terminada nuestra consulta, para que se ejecute debemos especificarlo explícitamente mediante el método execute.
Veamos algunos ejemplos de como usar lo que hemos visto en un query complejo y algunas variantes de como hacer esto.
comentarios recientes