CakePHP GROUP BY 和 HATBM 表上的 WHERE 和 COUNT

Nic*_*las 3 cakephp group-by count has-and-belongs-to-many cakephp-2.2

虽然我知道的groupcontainfieldsorder上一个选项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具有Influences1、2、3 和 4的数组,然后按.COUNT()InfluencesCOUNT() DESC

Model::query()在 CakePHP 中是否有一种干净的方法(我不想使用任何 hacks 或类似的函数)来做到这一点?


编辑: 虽然我没有改变我的问题的任何内容,它实际上不是一个SUM()而是一个COUNT()

mar*_*ark 5

您可以使用动态为下一个查询添加虚拟字段

$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)