Pregunta

Como parte de una aplicación web más grande (que usa CakePHP), estoy creando un sistema de blog simple.Las relaciones son sumamente simples:cada Usuario tiene un Blog, el cual tiene muchas Entradas, el cual tiene muchos Comentarios.

Un elemento que me gustaría incorporar es una lista de "entradas populares". Las entradas populares se han definido como aquellas con la mayor cantidad de comentarios en el último mes, y en última instancia, deben ser ordenados por el número de comentarios recientes.

Idealmente, me gustaría que la solución permanezca dentro del aparato de recuperación de datos del modelo de Cake (Model->find(), etc.), pero no soy optimista al respecto.

¿Alguien tiene una solución inteligente/elegante?Me estoy preparando para un hackeo de SQL salvaje para que esto funcione...

¿Fue útil?

Solución

Je, estaba a punto de volver con esencialmente la misma respuesta (usando el Modelo de Cake::find):

$this->loadModel('Comment');

$this->Comment->find( 'all', array(
    'fields' => array('COUNT(Comment.id) AS popularCount'),
    'conditions' => array(
        'Comment.created >' => strtotime('-1 month')
    ),
    'group' => 'Comment.blog_post_id',
    'order' => 'popularCount DESC',

    'contain' => array(
        'Entry' => array(
            'fields' => array( 'Entry.title' )
        )
    )
));

No es perfecto, pero funciona y se puede mejorar.

Realicé una mejora adicional al utilizar el comportamiento Contenible para extraer los datos de Entrada en lugar de los datos de Comentario.

Otros consejos

No debería ser tan malo, solo necesitas un grupo por (esto no es lo que tengo en la cabeza, así que perdona los errores de sintaxis):

SELECT entry-id, count(id) AS c 
FROM comment 
WHERE comment.createdate >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) 
GROUP BY entry-id 
ORDER BY c DESC

Si no le preocupaba la naturaleza urgente de los comentarios, podría hacer uso de la funcionalidad CounterCache de CakePHP agregando un campo "comment_count" a la tabla de entradas, configurando la clave CounterCache de la asociación de entrada de comentario pertenece a este campo, luego llame a find() en el modelo de entrada.

Probablemente quieras un DÓNDE cláusula para obtener solo los comentarios de los últimos 30 días:

SELECT entry-id, count(id) AS c 
FROM comment 
WHERE comment_date + 30 >= sysdate
GROUP BY entry-id 
ORDER BY c DESC
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top