Question

Dans le cadre de l'application web (en utilisant CakePHP), je suis en train de constituer un simple système de blog.Les relations sont extrêmement simples:chaque Utilisateur dispose d'un Blog, qui a plusieurs Entrées, qui ont beaucoup de Commentaires.

Un élément que j'aimerais intégrer une liste de "Populaire Entrées." Populaire Entrées ont été définis comme ceux avec le plus de Commentaires dans le dernier mois, et, finalement, ils doivent être commandés par le nombre de Commentaires récents.

Idéalement, j'aimerais que la solution de rester à l'intérieur du Gâteau du Modèle de données-récupération de l'appareil (Model->find(), etc.), mais je ne suis pas optimiste à ce sujet.

Quelqu'un aurait un habile/solution élégante?Je suis de l'affûter moi-même pour quelques sauvages SQL piratage pour faire ce travail...

Était-ce utile?

La solution

Heh, j'étais sur le point de revenir avec essentiellement la même réponse (à l'aide de Cake Model::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' )
        )
    )
));

Il n'est pas parfait, mais il fonctionne et peut être améliorée sur.

J'ai fait des progrès, en utilisant le behavior Containable comportement pour extraire les données d'Entrée à la place de l'observation des données.

Autres conseils

Ne devrait pas être trop mauvais, vous avez juste besoin d'un groupe par (ceci est éteint le type de ma tête, donc pardonner les erreurs de syntaxe):

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 vous n'avez pas embêté sur le temps sensible à la nature des commentaires, vous pouvez faire usage de CakePHP counterCache fonctionnalité en ajoutant un "comment_count" pour les entrées de la table, la configuration de la counterCache clé du Commentaire belongsTo Entrée de l'association avec ce champ, puis appel à find() sur le modèle d'Entrée de gamme.

Vous voudrez probablement une la clause d'obtenir juste des 30 derniers jours commentaires:

SELECT entry-id, count(id) AS c 
FROM comment 
WHERE comment_date + 30 >= sysdate
GROUP BY entry-id 
ORDER BY c DESC
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top