2012-09-27 60 views

回答

1

使用計數器緩存,見http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#belongsto

counterCache:如果設置爲true相關模型將自動 增加或減少「[singular_model_name] _count 「字段在 外部表中每當你做一個save()或delete()。如果它是一個字符串 那麼它是使用的字段名稱。計數器字段 中的值表示相關行的數量。您還可以通過使用數組(其中鍵爲字段名稱並且值 是條件)指定多個 計數器高速緩存。例如爲:

陣列( 'recipes_count'=>真, 'recipes_published'=>數組( 'Recipe.published'=> 1))counterScope:可選條件陣列用於更新計數器 緩存字段。

在這種情況下不需要額外的查詢。如果您添加/刪除帖子,它將自動在用戶表中減少計數。

例子:

public $belongsTo = array(
    'User' => array(
     'foreignKey' => 'user_id', 
     'counterCache' => true, 
     'counterScope' => array(
      'published' => 1))); 
+0

這是很棒的。如果我在創建記錄後添加它,它是否會追溯填充計數? –

+1

它會在下次添加或刪除記錄時執行此操作。只要看看代碼,它非常簡單。如果您想一次全部更新它們,請編寫一個shell腳本來更新所有現有記錄或使用遷移(github.com/cakedc/migrations) – burzum

1

這應該選擇做1篇文章以上

SELECT * FROM `users` as u 
INNER JOIN `posts` as p ON p.user_id = u.id 

在蛋糕,你應該能夠做這樣的事情的所有用戶:

$this->User->find('all', array('joins' => 
    array(
     'table' => 'posts', 
     'alias' => 'p', 
     'type' => 'inner', 
     'conditions' => array(
      'User.id = p.user_id' 
     ) 
    ) 
); 

[編輯]

也許你可加

'group' => 'User.id' 

'fields' => 'DISTINCT User.id, ...' 

刪除重複項

+0

這個查詢好像又回到了一堆愚弄的,每一個崗位,我相信。 –

+0

您可以嘗試使用羣組聲明來過濾出愚蠢。你也可以嘗試一個問題的答案非常類似我最近有:http://stackoverflow.com/questions/8707048/last-x-blog-entries-but-only-once-per-user/11933591#11933591 – mark