que tenía un problema ordenar una lista paginada cuando se utiliza un campo calculado como Count() en cakephp 1.3Cakephp paginación ordenar por campo calculado (COUNT)
Digamos que tengo dos modelos: el artículo y Comentarios (1 artículo x N comentarios) y quiero mostrar una lista paginada de los artículos que incluyen la cantidad de comentarios para cada uno. Tendría algo como esto:
controlador:
$this->paginate = array('limit'=>80,
'recursive'=>-1,
'fields'=>array("Article.*","COUNT(Comment.id) as nbr_comments"),
'joins'=>array(array( 'table' => 'comments',
'alias' => 'Comment',
'type' => 'LEFT',
'conditions' => array('Comment.article_id = Article.id'))
),
'group'=>"Article.id"
);
(tuve que sobreescribir el método findCount()
con el fin de utilizar paginate grupo por)
El problema es que en la vista , el método no funcionará sort()
:
<th><?php echo $this->Paginator->sort('nbr_comments');?></th> //life is not that easy
yo era capaz de crear una solución de "trampa" del p agination y ordenar:
controlador
$order = "Article.title";
$direction = "asc";
if(isset($this->passedArgs['sort']) && $this->passedArgs['sort']=="nbr_comments")
$order = $this->passedArgs['sort'];
$direction = $this->passedArgs['direction'];
unset($this->passedArgs['sort']);
unset($this->passedArgs['direction']);
}
$this->paginate = array(... 'order'=>$order." ".$direction, ...);
$this->set('articles', $this->paginate());
if($order == "clicks"){
$this->passedArgs['sort'] = $order;
$this->passedArgs['direction'] = $direction;
}
Ver
<?php $direction = (isset($this->passedArgs['direction']) && isset($this->passedArgs['sort']) && $this->passedArgs['sort'] == "nbr_comments" && $this->passedArgs['direction'] == "desc")?"asc":"desc";?>
<th><?php echo $this->Paginator->sort('Hits','clicks',array('direction'=>$direction));?></th>
Y funciona .. pero parece que es demasiado código para algo que debería ser transparente para el developper . (Se siente como si estuviera haciendo un trabajo de pastel) Entonces, estoy preguntando si hay otra manera más simple. Tal vez el pastel tiene esta función, pero decidió esconderlo ... o_O ... no hay nada sobre esto en la documentación, y no he encontrado otra buena solución en S.O ... ¿cómo lo haces?
¡Gracias de antemano!
ciertamente ayuda, =) con los campos virtuales no tengo que preocuparme por el agradecimiento '$ this-> passedArgs' ... sin embargo, aún necesita [anular el paginateCount] (http://stackoverflow.com/questions/7120257/cakephp-pagination-count-not-matching-query/7121798#7121798) método si desea paginar los resultados – pleasedontbelong
Otro problema es que a veces tendrá que determinar fields (conditions => fields) para que un campo virtual no sea solicitado/obtenido. Porque de lo contrario, la consulta podría cambiar. Por ejemplo, con el recuento de campo virtual (*): el método de búsqueda siempre devolverá solo 1 fila. – Philipili
No sabía de vitualFields, y ahora lo hago, y hacen exactamente lo que necesitaba. ¡Gracias! – Benjam