CakePHP: requestAction - Userlinux.net

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…

CakePHP: requestAction

04.Dec.2007 ~ 0 Comentarios ~ 3356 Lecturas
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->recursive =  0; // Devuelve Post + User
$this->Post->recursive =  1; // 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

Comentarios


Todavía no hay comentarios

Comentarios


Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 15 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Buscar

Cargando...

Últimos comentarios

  • graffic
  • reidrac
  • reidrac
  • Wu
  • dilam
  • r0sk
  • reidrac
  • r0sk
  • chucu
  • r0sk
  • el_palomo_programador
  • r0sk
  • reidrac
  • Player 1
  • r0sk

Moneting

Valor de mi cuenta de Facebook según Moneting
Valor de mi cuenta de Twitter según Moneting

Tagcloud

barça cakephp django juegos league macosx champions web personal sidenotes cake bsd ubuntu ds twitter cumpleaños bake ps3 programación rfilms rsidenotes felicidades userlinux sysadmin blog games nintendo conciertos php mysql deportes blogsfera apple iphone futbol vacaciones canción debian alemania_2006 linux bash 2008 python seguridad freebsd twitt humor ssh lucux mac mundial 2007 meme hack opinion films frases lugo openbsd blogs

Archivo

Social

Enlaces de interés