我有两张桌子:users
和posts
。我正在尝试选择至少有一篇帖子的任何用户。
我猜这需要连接或子选择。CakePHP 中有什么东西可以让这件事变得简单吗?
使用计数器缓存,请参阅http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#belongsto
counterCache:如果设置为 true,则每当您执行 save() 或 delete() 时,关联的模型将自动增加或减少外部表中的“[singular_model_name]_count”字段。如果它是一个字符串,那么它就是要使用的字段名称。计数器字段中的值表示相关行数。您还可以使用数组指定多个计数器缓存,其中键是字段名称,值是条件。例如:
array( 'recipes_count' => true, 'recipes_published' => array('Recipe.published' => 1) ) counterScope:用于更新计数器缓存字段的可选条件数组。
在这种情况下不需要额外的查询。如果您添加/删除帖子,它将自动进入并减少用户表中的计数。
例子:
public $belongsTo = array(
'User' => array(
'foreignKey' => 'user_id',
'counterCache' => true,
'counterScope' => array(
'published' => 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, ...'
删除重复条目