La clase QueryBuilder
Preparación de consultas SQL (BETA)
Mediante el Query Builder, podemos crear consultas
	SQL y ejecutarlas. Esta clase permite crear objetos QueryBuilder, trabajando con 
	PDO y sentencias preparadas. 
En la versión v2.2.0 de FastLight el QueryBuilder soporta
	consultas de selección, inserción, actualización y borrado sobre una única tabla.
	Soporta cláusulas WHERE, GROUB BY (y cálculo de totales mediante funciones 
	de agregado), ORDER BY, LIMIT y OFFSET. Otras funcionalidades 
	se irán añadiendo poco a poco.
Los siguientes ejemplos se muestran cómo crear consultas SQL de los tipos más comunes: SELECT, INSERT, UPDATE y DELETE. Para ver ejemplos de cómo ejecutar las consultas, visitad el ejemplo ejecución de consultas mediante el Query Builder.
El QueryBuilder de FastLight ORM se encuentra aún en desarrollo, no se debe usar más que a modo experimental y para detectar errores.
Índice
- Constructor de QueryBuilder.
- Métodos estáticos.
- Consultas de selección simples.
- Consultas con condiciones.
- Ordenación de registros.
- Límite y desplazamiento.
- Totales (funciones de agregado).
- Totales y grupos.
- Consultas de inserción.
- Consultas de actualización.
- Consultas de borrado.
- Consultas por partes.
Creando objetos QueryBuilder
El constructor
Para crear instancias de QueryBuilder, 
		podemos usar el constructor.
Parámetros
- int $type: tipo de consulta, puede serQueryBuilder::SELECT,QueryBuilder::INSERT,QueryBuilder::UPDATEoQueryBuilder::DELETE.
- string $table: tabla sobre la que se debe realizar la operación.
- ?PDO $pdo: conexión PDO sobre la que se ejecutará la consulta (opcional).
Ejemplo
Resultado de la ejecución
La conexión PDO se puede establecer o recuperar posteriormente mediante los métodos
		setPDO(PDO $pdo) y getPDO(). También se puede pasar en el momento de preparar la
		sentencia con el método prepare(?PDO $pdo) o bien cuando ejecutemos la consulta con el 
		método get(?PDO $pdo). Estos métodos se explican en el ejemplo ejecución de 
        consultas mediante el Query Builder.
Si tratamos de imprimir un objeto QueryBuilder 
	    o lo usamos en un contexto de sting, se mostrará la consulta SQL que generará.
	    También se puede recuperar el SQL haciendo uso del método getSQL().
Métodos estáticos
Para facilitar la tarea de crear instancias de QueryBuilder,
		existen también una serie de método estáticos que realizan la misma tarea. Todos ellos
		retornan la instancia creada.
- QueryBuilder::select($table [, $pdo])
- QueryBuilder::insert($table [, $pdo])
- QueryBuilder::update($table [, $pdo])
- QueryBuilder::delete($table [, $pdo])
El parámetro $table es obligatorio, mientras que la conexión
		PDO es opcional.
Ejemplo
Resultado de la ejecución
En todos los ejemplos a continuación, se muestran las consultas SQL que generan y los bindings para la ejecución de las sentencias preparadas.
Consultas SELECT sencillas
Todos los registros, todos los campos
Las consultas de selección más básicas consisten en recuperar todos los registros y todos los campos de una tabla. Para ello tan solo hace falta crear la instancia pasándole el nombre de tabla.
Ejemplo
Resultado de la ejecución
Todos los registros, algunos campos
Tenemos varias opciones para indicar los campos a recuperar en la consulta de selección.
        Podemos usar el método field(), que recibe por parámetro el nombre del campo
        a recuperar o el método fields(), que permite especificar un array de nombres de campo.
Es equivalente usar varias veces el método field() o usar una vez el 
        método fields() con varios campos.
Ejemplo usando el método field()
Resultado de la ejecución
Ejemplo usando el método fields()
Resultado de la ejecución
Consultas con condiciones
Para realizar consultas con condiciones, usamos los métodos
        where(), whereAnd(), whereOr(),
        whereLike(), whereRegExp(), whereIn(),
        whereNotBetween(), whereNotBetween() o 
        whereNotIn(). Es equivalente usar where() o whereAnd().
        El resto de métodos forman consultas con OR, LIKE, REGEXP, 
        BETWEEN, NOT BETWEEN, IN y NOT IN.
Ejemplo con where()
Es importante tener en cuenta que el método where() recibe dos parámetros:
- string $condition: condición a aplicar.
- mixed $value: valor a comparar.
La condición está formada por el campo, el operador y el interrogante, que es el símbolo para la posterior vinculación del parámetro.
Resultado de la ejecución
Ejemplo con whereAnd()
El método whereAnd() es alias de where().
Resultado de la ejecución
Ejemplo con whereOr()
Si queremos indicar varias condiciones, pero aplicando una OR en lugar de una AND, podemos
		usar el método whereOr().
Hay que tener cuidado con la precedencia de los operadores lógicos puesto que el AND es prioritario, por ese motivo este método añade paréntesis alrededor de la expresión. Aún así hay que revisar bien que la estructura de la clausula WHERE sea la que pretendemos.
Resultado de la ejecución
Ejemplo con whereAnd() y whereOr()
Las consultas que mezclan múltiples AND y OR pueden no salir como esperamos. Por ejemplo supongamos que queremos hacer (A OR B) AND C OR D, usando estos métodos obtendremos lo que se muestra en el siguiente ejemplo, que es (A OR B) AND (C OR D) y no es equivalente.
Algunos frameworks lo solucionan mediante un generador de expresiones complejo (Symfony), pero en FastLight esto aún no está contemplado. Una posible solución es realizar una vista en la BDD con la consulta deseada y realizar una consulta de selección simple sobre ella.
Resultado de la ejecución
Ejemplo con whereLike()
Para consultas con LIKE en la cláusula WHERE, podemos
        usar tanto el método where() en la forma en que se puede
        ver en el ejemplo anterior, o bien usar el método whereLike().
Resultado de la ejecución
Ejemplo con whereRegExp()
Si lo que queremos es hacer pattern matching mediante una expresión 
		regular, usaremos el método whereRegExp().
Resultado de la ejecución
Esto también se puede
		hacer usando el método where(), por ejemplo haciendo
		->where('name REGEXP ?', '^[AB]').
Ejemplo con whereBetween()
Este método nos permitirá aplicar un BETWEEN para buscar valores en rangos. Se puede usar tanto para números como para fechas o strings (no tan habitual). Recordemos que los valores de los extremos están incluidos.
Resultado de la ejecución
Ejemplo con whereNotBetween()
Este método permite buscar registros que no estén en el rango indicado. Evidentemente no aparecerán tampoco los que coincidan con los valores de los extremos.
Resultado de la ejecución
Ejemplo con whereIn
Permite buscar coincidencias en un campo concreto a partir de una lista de valores.
Resultado de la ejecución
Ejemplo con whereNotIn
No recuperará los registros con valores que coincidan con alguno de los indicados en el rango para ese campo.
Resultado de la ejecución
Consultas con ordenación
El método order() permite indicar un criterio de ordenación.
        Se indica campo y sentido, aunque el sentido es opcional (ascendente por defecto).
Para múltiples criterios de ordenación, podemos invocar varias veces al método. La mayor prioridad en la ordenación es del criterio que va antes.
Ejemplo
Resultado de la ejecución
Límite y desplazamiento
El método limit() permite indicar tanto el LIMIT
     	como el OFFSET para la consulta. Recibe dos números enteros como parámetro,
     	el primero es el límite y el segundo el desplazamiento (opcional, por defecto 0).
Ejemplo solo con LIMIT
Resultado de la ejecución
Ejemplo con LIMIT y OFFSET
Resultado de la ejecución
Consultas de totales
Para realizar consultas de totales o agregados sin agrupar, 
		podemos usar el método total().
- Si es invocado sin parámetros, calculará la cuenta (COUNT) de filas en la tabla (*) y el nombre del campo será allCount.
- Si es invocado con tan solo un parámetro con el valor COUNT funcionará y retornará el campo allCount, pero en otros casos fallará puesto que, por ejemplo, si pasamos MAX calculará el máximo de *.
- Con dos parámetros funcionará correctamente, por ejemplo si pasamos MAX y price calculará el máximo del precio y retornará un campo llamado priceMax.
Ejemplo (sin parámetros)
Resultado de la ejecución
Ejemplo de varios totales
En este ejemplo se calculan varios totales de una sola vez.
Resultado de la ejecución
La sintaxis del método total() también permite ahorrarnos
		algo de código usando pipes | en lugar de invocarlo varias veces.
Ejemplo
Resultado de la ejecución
Evidentemente, se pueden combinar condiciones y totales sin ningún problema.
Ejemplo
Resultado de la ejecución
Consultas SELECT con datos agrupados
Para añadir la cláusula GROUP BY a nuestras consultas mediante
        las herramientas de la clase QueryBuilder, usaremos los métodos
        group() y groups().
El primer método permite añadir un solo campo de agrupamiento, mientras
        que el segundo permite añadir múltiples campos a partir de un array.
        Es equivalente invocar a group() varias veces o invocar 
        a groups() una sola pasándole los mismos campos en un array.
A continuación se muestran un par de ejemplos con totales y grupos.
Ejemplo usando group()
Resultado de la ejecución
Ejemplo usando groups()
Resultado de la ejecución
Consultas de inserción
Consultas INSERT
Para las consultas de inserción, podemos usar el constructor o bien el método
		estático QueryBuilder::insert(). Una vez instanciado el objeto, usaremos
		el método field() con dos parámetros para indicar los pares de 
		campo y valor.
Ejemplo
Resultado de la ejecución
Consultas de actualización
Consultas UPDATE
Para las consultas de actualización, podemos usar el constructor o bien el método
		estático QueryBuilder::update(). Una vez instanciado el objeto, usaremos
		el método field() con dos parámetros para indicar los pares de 
		campo y valor.
No olvides indicar el registro o registros a actualizar, una mala actualización puede acabar con todos los datos de la tabla.
Ejemplo
Resultado de la ejecución
Consultas de borrado
Consultas DELETE
Para las consultas de borrado, podemos usar el constructor o bien el método
		estático QueryBuilder::delete().
No olvides indicar el registro o registros a eliminar o acabaremos eliminando todos los datos de la tabla.
Ejemplo
Resultado de la ejecución
Ejemplo de borrado múltiple
Resultado de la ejecución
Consultas por partes
Creando consultas a trozos
Nada nos impide ir creando el objeto QueryBuilder
        a trozos, incluso recuperar el SQL de la consulta parcial.
