Posted by proz on 7th Abril 2008

Busquedas en cakePHP

Seria algo asi como un search helper o algo por el estilo, la cosa es que no es un buscador de info sobre cake, sino un buscador para tu aplicación, la idea de esto es hacer un metodo en el app_controller que nos permita hacer busquedas en la BD partiendo de cualqueir modelo.

Lo primero es nuestro metodo de busqueda


function search(){
$this->autoRender = false;
$search = $this->data[$this->modelClass]['Buscar'];
$cond ="";
$i=0;
foreach($this->{$this->modelClass}->_schema as $field => $value){
//debug($field);
if($i>0){
$cond = $cond. " OR ";
}
$cond = $cond. " ".$this->modelClass.".".$field." ILIKE '%".$search."%' ";
$i++;
}
$conditions = array('limit'=>4, 'conditions'=> $cond);
$this->paginate = $conditions;
$this->set(strtolower($this->name), $this->paginate());
$this->render('index');
}

Probablemente esta es una busqueda que se puede optimizar muchisimo, pero como yo no soy ningun guru de SQL pues eso fue lo que se me ocurrio, lo que esto hace basicamente es armar las condiciones del find, buscando con cada campo del esquema de la tabla relacionada con el modelo ocurrencias de la frase de busqueda. Esto es mil veces mejorable colocando condiciones para las tablas relacionadas, y asi buscar en toda la info del registro y no solo por el id de la relación (bueno esta parte ni yo la entendi xD)

Como sabemos este metodo que colocamos en el app_controller estara disponible para todos nuestros controladores, asi que ahora solo nos falta colocar nuestra caja de busqueda en las vistas. Yo lo implemente de manera que la caja de busqueda vaya en el index, sobre la tabla paginada, y ojo no es que importe, es que esa es la razon por la cual el metodo regresa el resultado paginado y con el nombre de la clase.

En fin este es el codigo que debe ir en la vista


/*echo $paginator->counter(array(
'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true)
));*/
echo $form->create('', array('action'=>'search'));
echo $form->input('Buscar', array('type'=>'text'));
echo $form->end('Buscar');
?>

Como ven lo que he hecho es que quito la parte donde se coloca la información de la paginación y alli coloco la caja de busquedas, y pues eso es todo, de esta manera pueden colocarle busquedas a todos los controladores, espero les sirva de algo ^^

    5 Responses

  1. Natalia dice:

    Perfecto anda de 10! me salvaste la vida! 1000 gracias! ;)

  2. ¿Puedes darme un ejemplo de como mortrar el resultado de la busqueda en la vista?
    Estoy un poco bloqueado y no lo veo… ;)
    Gracias.

  3. Rodrigo dice:

    Excelente aporte compañero. Funciona perfectamente. Muchas gracias.

  4. xcvxcvxv dice:

    No me funciona!!!
    Podrias aclarar por favor cómo implementarlo…

    Gracias.

  5. xcvxcvxv dice:

    Listo!!!

    El problema era con el query sql que no funciona el ILIKE y lo deje como LIKe.

    Gracias.

Post your comments