Método find() (cakePhp) Escucha este post

1 comentarios



http://aacini.comlu.com/blogger/metodoFine/cakephp-1024-768.jpg

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’