2012-09-27 36 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