CakePHP: requestAction
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->recursive = 0; // Devuelve Post + User $this->Post->recursive = 1; // Devuelve Post + User + CommentsTodo 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
Comentarios