CakePHP: requestAction

04.dic 2007 Envía un trackback

Siguiendo con tips -o pequeñas notas mentales- de CakePHP esta vez le ha tocado el gordo a requestAction. En este caso concreto, teniendo un modelo Posts relacionado íntimamente con otros dos: Users y Comments, queremos mostrar el número de comentarios escritos en cada entrada.

Lo que sería una simple consulta SQL en programación normal se antoja un poco diferente en MVC puesto que debemos guardar un cierto orden de lo que es cada cosa. Primero crearemos una función -en posts_controller.php- que calcule el número de comentarios que existen en cada Post:

function countComments($id)
{
        return $this->Post->Comment->find('count',array('conditions'=>
        array('Post.id'=>'= '.$id)));
}
Sencillo, pasado un id como argumento, contamos los Comments que cumplan la condición 'Post.id = $id'.. El valor es devuelto, por lo que la llamada -en vista- sería algo así: foreach ($posts as $post):
        $numComments = $this->requestAction('posts/countComments/'.
        $post['Post']['id']);
        ...
endforeach;
No es la mejor forma de trabajar, se puede optimizar bastante. Así a primera vista se me ocurren un par de optimizaciones. Primero, para no hacer un requestAction por cada Post, podemos sacarlo del bucle y modificar un poco la función countComments para que devuelva un array con todos los valores que necesitamos -Array($id, $numComments)-.

La segunda opción se corresponde con la forma más adecuada de representar los datos. Ya que tenemos varios modelos relacionados, lo mejor es aprovechar las características que ofrece CakePHP para combinar las relaciones. Traducido a código nos estamos refiriendo a la variable $recursive a nivel de controlador. Dependiendo del nivel que otorguemos a esta variable las consultas cogerán una profundidad u otra: $this->Post->recursive = -1; // Devuelve Post
$this->Post->recursive0; // Devuelve Post + User
$this->Post->recursive1; // Devuelve Post + User + Comments
Todo en un mismo array en el que podemos trabajar con suma facilidad: Array
(
        [Post] => Array
                (
                        [id] => 1103
                        ...
                        [created] => 2007-04-09 11:57:07
                        [modified] => 2007-04-09 11:57:07
                )
       
        [User] => Array
                (
                        [id] => 12
                        ...
                )
       
        [Comment] => Array
                (
                        [0] => Array
                                (
                                        [id] => 6436
                                        ...
                                        [created] => 2007-04-09 18:47:42
                                        [modified] => 2007-04-09 18:47:42
                                )
                        [1] => Array
                                (
                                        [id] => 6437
                                        ...
                                        [created] => 2007-04-09 19:14:46
                                        [modified] => 2007-04-09 19:14:46
                                )
       
                )
)
Solo queda contar el número de comentarios que tiene cada entrada -count($post['Comment'])- y ajustarlo a la vista correspondiente. Coser y cantar.

Vemos que en CakePHP hay mil recursos distintos para la misma operación, el mayor trabajo por nuestra parte consiste en conocerlos todos -¡o más!- y adaptar el más eficiente en base a nuestros requisitos. El resto es automagia.

Enlaces
cake bake requestAction

Escribe tu comentario
 
 
Guardar datos
Escribe tu comentario:
captcha


Intenta que tu comentario sea interesante y con información relevante al tema de la entrada. BBCodes disponibles: [url=http://direccion]texto[/url], negrita: [b]texto[/b], itálica: [i]texto[/i], subrayada: [u]texto[/u]. Para mencionar o citar a alguien (quote): [cita]texto[/cita]