Hola que tal queridos lectores(si
es que hay alguno por ahi) hoy les traigo otro tema acerca de cakephp. La forma
de utilizar el método find() de un Model cualquiera.
Como ya sabrás para contar con una conexión a la base de
datos tendrás que configurar un el archivo database.php. que se encuentra en
MiProyecto\app\config\(original mente se llama database.php.default) y después crear
un archivo en MiProyecto \app\models llamado como la tabla que creas te en
mysql pero en singular (sin la ‘s’)por ejemplo alumno.php.
<?php
//la clase debe ser igual que el nombre del archivo, siempre con sintaxis de camello
class Alumno extends AppModel{
var $name='Alumno';
}
?>
Y finalmente el controller que va en MiProyecto\app\controllers
con el nombre de la tabla +”_controller”seria: alumnos_controller.php con el código
<?php
//como el archivo +Controller , siempre con sintaxis Camello
class AlumnosController extends AppController{
var $name='Alumnos';
}
?>
Ahora si a lo que nos truje: el método find()
Siempre por defcto en nuestro controller hay una instancia de la clase modelo que
por defecto corresponde a dicho modelo. Por ejemplo si el controller se llama AlumnosController si instanciara
Alumno en el controller
y o usamos asi:
$this->Alumno->find();
Es te método solo tiene dos parámetros :
1.- $type que es del tipo String y puede tener los
siguientes valores
a) all devuelve todos los registros que cumplen las condiciones si las hay(devuelve
un array multidimensional)
b) first devuelve solo el primer registro en cumplir las condiciones(devuelve
un array diferente si lo usamos)
c) count devuelve el numero totla de registros dados por la consulta (devuelve
un array diferente)
2.- $constraints es un array asociativo con los posibles ítems:
a) fields es array de los campos que tienen que ser devuelta por la consulta
b) conditions es un array de condiciones aplicadas a where(sql)
c) order string define la clausula ORDER BY
d)limit es un entero especifica el numero de ítems
e)offset desde cual ítem empezar
Probemos suponiendo que tenemos la siguiente tabla
Para que la tabla nos devuelva todos los registros sin
condiciones seria
$answer=$this->Alumno->find(‘all’);
como se ve solo le pasamos el primer parámetro
Para preguntar solo por los ítems nombre,apellido y edad usamos el segundo parámetro
y el ítem fields prefuntamos por dichos campos seria:
$ answer =
$this->Alumno->find(
'all',
array(
'fields'=>array(
'Alumno.nombre',
'Alumno.apellidos',
'Alumno.edad'
),
));
Como se ve son dos arrays en el segundo parámetro
Ahora si queremos restringir mas la búsqueda debemos usar los demás ítems en
el segundo parámetro.Por ejemplo en esta consulta preguntamos por los campos
nombre,apellidos y edad, pero solo queremos los que en nombre empiezen por j('conditions'=>array('Alumno.nombre
like'=>'J%'),), y también los ordenamos en
orden ascendente('order'=>'Alumno.apellidos ASC',).Finalmente limitamos los resultados a solo 10('limit'=>10)
$ answer = $this->Alumno->find(
'all',
array(
'fields'=>array(
'Alumno.nombre',
'Alumno.apellidos',
'Alumno.edad'
),
'conditions'=>array('Alumno.nombre like'=>'J%'),
'order'=>'Alumno.apellidos ASC',
'limit'=>10
));
Otros ejemplos:
// numero total de alumnos
que empiezan con el caracter j
$ answer = $this->Alumno->find('count',
array(
'conditions'=>array('Alumno.nombre like'=>'J%'),
));
//encontrar el codigo y el
nombre del alumno con el id mas alto y ordenar por id descendente
$ answer = $this->Alumno->find('first',
array(
'fields'=>array(
'Alumno.codigo',
'Alumno.nombre'
),
'order'=>'Alumno.id DESC'
));
// los alumnos que tienen el
apellido Montero ,ordenar por nombre ascendente
$alumnosMontero
= $this->Alumno->find('all',
array(
'fields'=>array(
'Alumno.nombre',
'Alumno.apellidos',
'Alumno.edad'
),
'conditions'=>array('Alumno.apellidos
like'=>'%Montero%'),
'order'=>'Alumno.nombre ASC',
));
Ahora
metamos las manos bien adentro en esto, veamos consultas más complejas
¿Como
preguntar por un mismo campo pero con valores diferentes?. Por ejemplo
preguntar por 3 códigos específicos .Lo que se tiene que hacer es en lugar de
igualar un string en ‘conditions’, lo relacionamos con otro array (po rdefecto
se entiende que es igual al menos que especifiquemos lo contrario)
$alumnos030507=
$this->Alumno->find('all',
array(
'fields'=>array(
'Alumno.codigo',
'Alumno.nombre',
'Alumno.apellidos',
'Alumno.edad'
),
'conditions'=>array('Alumno.codigo'=>array('0003','0005','0007'))
));
Condiciones múltiples
Por defecto el condicional es
and . Si queremos tener mas de una condición con este operador lo podemos
omitir y solo agregar ítems en el array conditions
Como vemos ahora:
// Monteros que tengan 17 años
$alumnosMontero17= $this->Alumno->find('all',
array(
'fields'=>array(
'Alumno.nombre',
'Alumno.apellidos',
'Alumno.edad'
),
'conditions'=>array('Alumno.apellidos
like'=>'%Montero%','Alumno.edad'=>'17')
));
Esta consulta seria para pedir
los campos nombre, apellidos y edad de los que tengan el apellido Montero y
tengan edad de 17.
Para ocupar otro operador por
ejemplo or, Dentro del array relacional ‘conditions’ tenemos que meter un ítem
llamado ‘or’ que es otro array relacional . Dentro de este array metemos las
condiciones. Por ejemplo la siguiente consulta pregunta por los Jaime o los que
tengan 19 años de dad
$alumnosMonteroor17=
$this->Alumno->find('all',
array(
'fields'=>array(
'Alumno.nombre',
'Alumno.apellidos',
'Alumno.edad'
),
'conditions'=>array(
'or'=>array('Alumno.apellidos
like'=>'%Montero%','Alumno.edad'=>'17')
)
));
Esta consulta seira
equivalente a
if(($apellidos==’Montero’)or($edad==17))
en php y esta es la consulta sql que hace
SELECT `Alumno`.`nombre`, `Alumno`.`apellidos`, `Alumno`.`edad`
FROM `alumnos` AS `Alumno` WHERE ((`Alumno`.`apellidos` like '%Montero%') OR
(`Alumno`.`edad` = '17'))
Para combinar operadores and y
or los agrupamos en arrays. Vemos un ejemplo de la condiciones para una
consulta:
'conditions'=>array(
'or'=>array(
array('Alumno.apellidos
LIKE'=>'%Montero%','Alumno.edad'=>'17'),
array('Alumno.nombre
LIKE'=>'Rosa','Alumno.edad'=>'19')
)
)
En esta consulta preguntamos
por los Monteros que tengan 17 años o los Rosa que tengan 19 años. Como se ve
creamos un ítem llamado ‘or’ y lo hacemos igual a un array donde dentro ponemos
todos los arrays que se entenderán como las partes de ese or, Al mismo tiempo
esos arrays anidados tienen dos ítems y por defecto usan el and asi que las
partes de ese array serán tomados como los los valores para ese and. Si pudiéramos
pasarlo a un código php mas simple este seria:
if(
( ($apellidos==’Montero’)and($edad==17)) or (($nombre==’Rosa’)and($edad==19)) )
O bien su consulta que hace
es :
SELECT `Alumno`.`nombre`, `Alumno`.`apellidos`, `Alumno`.`edad`
FROM `alumnos` AS `Alumno` WHERE ((((`Alumno`.`apellidos` LIKE '%Montero%') AND
(`Alumno`.`edad` = '17'))) OR (((`Alumno`.`nombre` LIKE 'Rosa') AND
(`Alumno`.`edad` = '19'))))
Otra función parecida a find() pero mas fácil de usar es
findBy()
donde agregamos el nombre del campo que deseamos preguntar y como argumento el
campo. Nos devuelve el primer ítem que coincida en un array similar al que
devuelve ‘first’
$alumnosMagic=$this->Alumno->findByNombre('Manuel');
Solo nos devuelve el primer ítem si queremos que devuelva todos
usamos Si queremos que nos devuelva todos usamos finnAllBy(). En este método
igual le pasamos el nombre del campo por el que queremos preguntar en sintaxis
camello.
$alumnosAllBy=$this->Alumno->findAllByEdad('17');
Nos devuelve un array similar al devuelto por ‘all’