Nic*_*las 3 cakephp group-by count has-and-belongs-to-many cakephp-2.2
虽然我知道的group
,contain
,fields
和order
上一个选项find()
,我似乎无法让下面的查询使用CakePHP 2.2.3:
SELECT `User`.*, SUM(`Influence`.`id`) AS matches
FROM `db`.`users` AS `User`
LEFT JOIN `db`.`influences_users` AS `InfluencesUser` ON (`User`.`id` = `InfluencesUser`.`user_id`)
LEFT JOIN `db`.`influences` AS `Influence` ON (`InfluencesUser`.`influence_id` = `Influence`.`id`)
WHERE 1 = 1
AND `Influence`.`id` IN (1, 2, 3, 4)
GROUP BY `User`.`id`
ORDER BY COUNT(`Influence`.`id`) DESC
Run Code Online (Sandbox Code Playgroud)
基本上,我试图用表上的函数检索Users
具有Influences
1、2、3 和 4的数组,然后按.COUNT()
Influences
COUNT() DESC
Model::query()
在 CakePHP 中是否有一种干净的方法(我不想使用任何 hacks 或类似的函数)来做到这一点?
编辑: 虽然我没有改变我的问题的任何内容,但它实际上不是一个SUM()
而是一个COUNT()
。
您可以使用动态为下一个查询添加虚拟字段
$this->virtualFields['matches'] = 'SUM(Influence.id)';
Run Code Online (Sandbox Code Playgroud)
然后你可以直接在你的结果数组中使用它:
echo $user['User']['matches']; // if you query on the User model that is
Run Code Online (Sandbox Code Playgroud)
您也可以在您的订单/条件等中使用它:
'order' => array('User__matches' => 'DESC')
Run Code Online (Sandbox Code Playgroud)
但是,您需要处理模型,该模型将所有其他模型都作为“belongsTo”!所以使用“InfluencesUser”并包含“Influence”和“User”
所以在你的情况下:
$this->User->InfluencesUser->virtualFields['matches'] = 'SUM(Influence.id)';
...
$results = $this->User->InfluencesUser->find(...)
Run Code Online (Sandbox Code Playgroud)
和
echo $result['InfluencesUser']['matches']; //in the view
Run Code Online (Sandbox Code Playgroud)
和
'order' => array('InfluencesUser__matches' => 'DESC')
Run Code Online (Sandbox Code Playgroud)