Punksolid Tecnologia, Curiosidades, Sistemas de Informacion y un poco de Religion

12ago/114

Busquedas de filtros complejos en CakePHP

Para comprender la situación mejor, necesitamos ver el screenshot de la vista.

Hay varias formas de hacer esto, la mas común es usar la función query de CakePHP para armar la consulta SQL en base a condiciones by (@el_keogh) , está la función find, pero no se pueden poner condiciones dentro, así que lo que se puede hacer es armar el array conditions desde afuera de la siguiente forma:

 

<?php 
//Bloque #1 asignacion de variables para comodidad
$alumnoid=$this->data['Examene']['cuenta'];
$user=$this->data['Examene']['user'];
$fechaInicio=$this->data['Examene']['Fecha de Inicio'];
$fechaFin=$this->data['Examene']['Fecha de Fin'];
$formadepago=$this->data['Examene']['forma_de_pago'];
$resultado=$this->data['Examene']['resultado'];
$conditions=array();
 
//Bloque #2 Condiciones tabla Alumnos
if(!empty($this->data['Examene']['nombre'])){
	$conditions['Alumno.nombre LIKE']='%'.$this->data['Examene']['nombre'].'%';
}
if(!empty($this->data['Examene']['apellido_paterno'])){
	$conditions['Alumno.apellido_paterno LIKE']='%'.$this->data['Examene']['apellido_paterno'].'%';
}
if(!empty($this->data['Examene']['apellido_materno'])){
	$conditions['Alumno.apellido_materno LIKE']='%'.$this->data['Examene']['apellido_materno'].'%';
}
//Bloque #3 Condiciones tabla Examenes
if(!empty($alumnoid)){
	$conditions['Examene.alumno_id']=$alumnoid;
}
if(!empty($user)){
	$conditions['Examene.user_id']=$user;
}
//Bloque #4 Condiciones de intervalos de fecha
if(!empty($fechaInicio)){
	$conditions['Examene.created >'] = $fechaInicio;
}
if(!empty($fechaFin)){
	$conditions['Examene.created <='] =$fechaFin.' 23:59:59';
}
if(!empty($formadepago)){
	$conditions['Examene.forma_de_pago'] =$formadepago;
}
if(!empty($resultado)){
	$conditions['Examene.resultado'] =$resultado;
}
//Bloque #5 query
$conditions['Examene.statusid <>']=4;
$examenes= $this->paginate($conditions);
?>

Bloque #1 asignación de variables

En este caso se manejan dos tablas distintas de la base de datos, están relacionadas entre si, Alumnos y Examenes, utilicé asignación de variables para mas comodidad en su manejo, pero no son necesarias.

Bloque #2 Condiciones de tabla Alumnos

Las condiciones determinan cuando hay datos en los campos, si no hay datos, no hay condición que aplicar y nada que meter en el array, las primeras tres condiciones pertenecen a la tabla alumnos, de la cual se va a buscar por nombre NO exacto por eso los LIKE y la concatenación del símbolo de porcentaje. Para que esto funcione, las relaciones en el modelo deben estar previamente establecidas.

Bloque #3 Condiciones de tabla Examenes

En el segundo bloque ponemos las condiciones de la otra tabla, nada especial ya que los valores de esos campos deben ser exactos.

Bloque #4 Condiciones de intervalos de fecha

Para cuando tenemos intervalos de fechas y tenemos el formato en Datetime, es necesario concatenar la hora en la que termina el dia, si no lo hiciéramos contaría hasta la hora 00:00:00 no devolviéndonos los resultados del ultimo dia especificado.

Bloque #5 Query

La función paginate, se utiliza casi de la misma manera que un find y listo automagicamente cakephp devolverá solo los exámenes de los campos donde se les haya especificado algun dato, notese que este tipo de búsqueda es de tipo AND, o sea cada campo va filtrando aun mas la búsqueda, en lugar de añadir nuevas coincidencias.

Cualquier duda o comentario es bienvenido.
Referencias
Complex Find Conditions
Pagination in cakephp

Talvez te interese leer

Comentarios (4) Trackbacks (0)
  1. Hola una consulta como se haria la consulta en el caso de que necesitaria poner una condicion OR

  2. Facil, solo tienes que especificar que es OR en el array, ya que por default es AND
    array( “OR” => array (
    “Post.title” => array(“First post”, “Second post”, “Third post”),
    “Post.created >” => date(‘Y-m-d’, strtotime(“-2 weeks”))
    )
    )

  3. hola, a ver si me puedes ayudar: tengo una tabla de post y otra de observaciones, cada post puede tener una o mas observaciones, el modelo Post tiene una relacion has many hacia Observacione, pregunta: como puedo hacer un paginate (desde el controlador post_controller) que me devuelva SOLO los post que tengan observaciones?

  4. Hola @Angel, paginate() recibe las condiciones similar al find, tu consulta quedaría como esto $this->paginate(array (“NOT” => array (
    “Post.observaciones” => null )
    )


Leave a comment

(required)

Aún no hay trackbacks.