El framework cakephp tiene una definición de los modelos muy potente, lo que el facil acceso a datos de la base de datos, realizando consultas todo lo complejas que se desee.
Consulta sencilla
Las consultas más simples, que afectan a una única columna son fáciles de realizar, se resuelven con un find y la condición pasada como un parámetro en la llamada a este método.
De esta manera:
$this->Modelo->find('all' ,
array('conditions'=>'Modelo.columna = valor'))
se generará un select con una condición
where Modelo.columna = valor
Consulta con varias condiciones separadas por AND
Surge la duda de ¿qué sucede si deseamos realizar una consulta con varias condiciones?, se podría lograr colocando como segundo parámetro de el array conditions una cadena con todas las condiciones concatenadas con AND entre ellas, pero cakephp ya pensó en eso y hay una manera más sencilla y más limpia de hacerlo, que es pasar un array con todas las condiciones que deseamos que cumpla la consulta, con el formato Modelo.columna => valor :
De esta manera:
$this->Modelo->find('all',
array( 'conditions'=>
array( 'Modelo.columna' => 'valor',
'Modelo.columna2' => 'valor2')
)
)
Esta llamada generará una consulta con una condición
where Modelo.columna = valor1 AND Modelo.columna2 = valor2
Consulta utilizando <>, <=, >=, > o <
Si en lugar de querer que todas las columnas coincidan con los valores que se les pasan en el array, queremos que alguna columna sea distinta del valor, la condición debería tener este formato.
$this->Modelo->find('all',
array( 'conditions'=>
array(
'Modelo.columna <>‘ => ‘valor’,
‘Modelo.columna2′ => ‘valor2 ‘
)
)
)
Esta llamada generará una consulta con una condición
where Modelo.columna <> valor1 AND Modelo.columna2 = valor2
Este formato también permitiría además de utilizar el distinto de (<>), utlizar mayor que (>) ,mayor o igual que (>=), menor que (<) o menor o igual que (<=).
Consulta utilizando OR
Una nueva duda surge cuando se nos plantea, ¿qué pasa si en lugar de realizar una consulta con condiciones separadas con AND queremos crear una consulta con las condiciones separada por OR ?, pues cakephp también permite hacerlo de manera muy sencilla, creando un find con el siguiente formato:
$this->Modelo->find('all',
array('conditions'=>
array(
'OR'=>array(
'Modelo.columna' => 'valor',
'Modelo.columna2' => 'valor2'
)
)
)
)
Esto creará una consulta con una condición
where Modelo.columna = valor OR Modelo.columna2 = valor2
Esta opción se puede utilizar con cualquiera de los operadores booleanos AND, OR, NOT, XOR.
Cakephp también permite otras opciones más complejas:
Consulta utilizando IN
¿Qué sucede si queremos utilizar una consulta en la que queramos que una columna coincida con una serie de valores?. Para esto, lo más sencillo sería utilizar la sentencia sql in.
Instintivamente la primera idea que podemos tener para crear una consulta de este tipo es generar una cadena con todos los valores que deseamos pasarle a la consulta y esto concatenarlo con Modelo.columna IN.
Cakephp ya había pensado en esto y ha hecho que sea mucho más sencillo que todo esto, para realizar una consulta con un IN como condición habrá que pasarle un array con los valores que queramos que se compruebe la coincidencia, de este modo:
$valores = array(1,2,3,4,5,6);
$this->Modelo->find('all',
array('conditions'=>
array( 'Modelo.columna' => $valores,
'Modelo.columna2' => 'valor2' )
)
)
Esto creará la siguiente consulta:
where Modelo.columna in (1,2,3,4,5,6) AND Modelo.columna2 = valor2
Consulta utilizando NOT IN
Si en lugar de que se compruebe la coincidencia con ciertos valores, se compruebe la no coincidencia (NOT IN), haremos la llamada de esta manera:
$valores = array(1,2,3,4,5,6);
$this->Modelo->find('all',
array('conditions'=>
array('NOT'=>
array( 'Modelo.columna' => $valores),
'Modelo.columna2' => 'valor2')
)
)
Esto creará la siguiente consulta:
where Modelo.columna NOT IN (1,2,3,4,5,6) AND Modelo.columna2 = valor2
Consulta utilizando BETWEEN
Podría darse la posibilidad de tener que comprobar si el valor de un campo está contenido entre dos valores dados (BETWEEN), para esto igual que para la expresión in se nos ocurriría crear una cadena concatenando los valores y la sentencia sql, pero cakephp permite una forma mucho más sencilla de crearlo:
$this->Modelo->find('all',
array('conditions'=>
array(
array('Modelo.columna BETWEEN ? AND ?' => array(1,8) )
)
)
)
Esta llamada al find crearía una consulta sql con la siguiente condición:
where Modelo.columna between 1 AND 8
Con todas estas opciones se podrían crear consultas tan complejas como deseemos sin tener que preocuparnos de generar cadenas con el código sql para concatenar a las condiciones, de una manera muy sencilla e intuitiva.
