Frage

Als Teil einer größeren Web-App (mit CakePHP) stelle ich ein einfaches Blog-System zusammen.Die Zusammenhänge sind überaus einfach:Jeder Benutzer hat einen Blog mit vielen Einträgen und vielen Kommentaren.

Ein Element, das ich gerne aufnehmen möchte, ist eine Liste der "beliebten Einträge". Beliebte Einträge wurden als diejenigen mit den meisten Kommentaren im letzten Monat definiert, und letztendlich müssen sie durch die Anzahl der jüngsten Kommentare bestellt werden.

Im Idealfall möchte ich, dass die Lösung innerhalb des Datenabrufapparats von Cakes Modell bleibt (Model->find(), usw.), aber ich bin diesbezüglich nicht zuversichtlich.

Hat jemand eine clevere/elegante Lösung?Ich bereite mich auf wildes SQL-Hacken vor, damit das funktioniert ...

War es hilfreich?

Lösung

Heh, ich war gerade dabei, mit im Wesentlichen der gleichen Antwort zurückzukommen (unter Verwendung von Cakes 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' )
        )
    )
));

Es ist nicht perfekt, aber es funktioniert und kann verbessert werden.

Ich habe eine zusätzliche Verbesserung vorgenommen und das Containable-Verhalten verwendet, um die Eintragsdaten anstelle der Kommentardaten zu extrahieren.

Andere Tipps

Sollte nicht so schlimm sein, Sie brauchen nur eine Gruppe nach (das geht mir nicht in den Sinn, also verzeihen Sie Syntaxfehler):

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

Wenn Ihnen der zeitkritische Charakter der Kommentare nichts ausmacht, können Sie die counterCache-Funktionalität von CakePHP nutzen, indem Sie der Eintragstabelle ein Feld „comment_count“ hinzufügen und dann den counterCache-Schlüssel der Zuordnung „Comment gehört zu Eintrag“ mit diesem Feld konfigurieren Rufen Sie find() für das Entry-Modell auf.

Sie möchten wahrscheinlich ein WO Klausel, um nur Kommentare der letzten 30 Tage zu erhalten:

SELECT entry-id, count(id) AS c 
FROM comment 
WHERE comment_date + 30 >= sysdate
GROUP BY entry-id 
ORDER BY c DESC
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top