2009-12-16 109 views
0

我有一個博客,我想找出找到評論最多的帖子的最佳方法。我有一個直接的設置,帖子有很多評論,評論屬於帖子。查找最多評論的帖子

我試圖找到一個1行「正確的方式」來做到這一點,但無法找到它。我想獲得前10名的評論文章。

感謝

回答

3

CakePHP有這個確切的目的counterCache功能。

確保您的職位表中包含一個「COMMENT_COUNT」字段。

然後添加counterCache關鍵評價模型屬於關聯後設置。

// app/models/comment.php 
var $belongsTo = array(
    'Post' => array(
    'counterCache' => true 
) 
); 

的CakePHP現在會自動遞增/遞減Post.comment_count場每次屬於該信息的評論中被添加或刪除。

要獲得前10名最多評論的帖子:

// app/models/post.php 
function getTopCommentedPosts($limit = 10) { 
    return $this->find('all', array(
    'order' => 'Post.comment_count DESC', 
    'limit' => $limit 
)); 
} 

然後調用從需要該數據的任何控制器操作此方法。如果從除PostsController使用其他控制器:

$this->set('posts', ClassRegistry::init('Post')->getTopCommentedPosts()); 
+0

謝謝,這正是我需要的。 – 2010-01-06 15:29:52

0

如果CakePHP會允許你直接使用SQL查詢:

SELECT 
    POST.POST_ID 
    COUNT(*) 
FROM 
    POST_TABLE POST 
    INNER JOIN COMMENT_TABLE COMMENT ON COMMENT.POST_ID = POST.POST_ID 
GROUP BY POST.POST_ID 
ORDER BY COUNT(*) 

應該做的伎倆,並很可能會非常有效。

1

你有這個數據庫嗎?如果是這樣,也許你可以使用郵政表中的計算字段來跟蹤每篇文章的評論數量。

就用

SELECT TOP 10 FROM Post ORDER BY CommentNumber DESC 
0

我會雜交兩種方法,主要是B/C我不知道你的限制或您的主要關注點。不管Adams還是moranu的解決方案都可以工作,儘管有所不同。

如果你有一個大的數據庫,並且性能是一個問題,您應該採取第一種方法。每次添加新評論時,都會要求您增加該號碼。或者,如果您的網站不需要經常更新前10位的內容,則可以緩存您的「前10條評論性文章」Feed。

我的建議:如果是太難遞增CommentNumber場(遺留代碼等),你可以運行每小時/每日腳本來更新這個數字對你來說,通過執行第二個查詢。我可能會建議你從這些選項中選擇適合你的要求的選項。

+0

計算字段是由你爲它設置的腳本automaticaly更新,你不需要每次遞增它,你插入另一個評論。 – morsanu 2009-12-16 19:49:06

+0

您的意思是計算的字段應該通過每個插入到代碼模型中的代碼進行更新?我同意這一點。我唯一的意見就是可以在帖子中插入不同的插入點,並且您必須將「爲其設置的腳本」附加到提供的鉤子上。它仍然不是免費的,不知道確切的情況,我很難評估OP將它添加進去有多困難。 – 2009-12-16 22:47:10

+0

只能將公式附加到數據庫中的計算字段。就是這樣。 「計算列實際上並未在相關數據庫表上物理創建,除非它們被定義爲」Persisted「計算列。您可以將計算列視爲虛擬列,它們並不物理存儲在相關的sql數據庫表中。每次在sql語句中引用它們。「 但是,無論如何,我認爲我們在這裏與這個計算的現場討論有點關係:) – morsanu 2009-12-17 07:44:49