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 ^^

This entry was posted in Cakephp, General, Programacion. Bookmark the permalink.

11 Responses to Busquedas en cakePHP

  1. Natalia says:

    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 says:

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

  4. xcvxcvxv says:

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

    Gracias.

  5. xcvxcvxv says:

    Listo!!!

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

    Gracias.

  6. azeledon says:

    Excellente!!! funciona de maravilla y me facilito la vida 100%

  7. pablo says:

    Excelente. Fiunciona OK. Ahora, se me preenta este problema, despues de una busqueda al ordenar por una columna, se pierde el filtro ( mustra todos los registros de la tabla). Se te ocurre como poder ordenar por columnas manteniendo los datos filtrados ?
    Muchas Gracias

  8. Js says:

    Hola, mil gracias, tambien a mi me salvastes de hacer muchas cosas. Tambien tengo el problema de Pablo que al ordenar se pierde el filtro tambien si se pagina. Agradeceria si dieras algun tip para evitar que suceda eso.
    Gracias, nuevamente.

  9. Js says:

    ufff!!! disculpen mi redacción.

  10. dany says:

    Realmente no funciona

  11. tripaseca says:

    Muchisimas gracias, llevaba dias buscando como se podia hacer esto en cakephp y por fin lo he conseguido gracias a ti

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>