3

尽管我知道 a 上的group、和选项contain,但我似乎无法使用 CakePHP 2.2.3 进行以下查询:fieldsorderfind()

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

基本上,我正在尝试使用表上的函数检索Users具有Influences1、2、3 和 4的数组,然后按.COUNT()InfluencesCOUNT() DESC

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


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

4

3 回答 3

5

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

$this->virtualFields['matches'] = 'SUM(Influence.id)';

然后你可以直接在你的结果数组中使用它:

echo $user['User']['matches']; // if you query on the User model that is

您也可以在您的订单/条件等上使用它:

'order' => array('User__matches' => 'DESC')

但是,您需要处理模型,该模型将所有其他模型都称为“belongsTo”!所以使用“InfluencesUser”并包含“Influence”和“User”

所以在你的情况下:

$this->User->InfluencesUser->virtualFields['matches'] = 'SUM(Influence.id)';
...
$results = $this->User->InfluencesUser->find(...)

echo $result['InfluencesUser']['matches']; //in the view

'order' => array('InfluencesUser__matches' => 'DESC')
于 2012-11-26T13:24:26.650 回答
2

我设法找到了一个解决方案,不是太老套,除非有人有更好的解决方案(当你看到我得到的答案数量时不是很多),这里是:

$this->User->virtualFields['matches'] = 'COUNT(InfluencesUser.influence_id)';
$matches = $this->User->find(
        'all',
        array(
            'joins' => array(
                array(
                    'alias' => 'InfluencesUser',
                    'table' => 'influences_users',
                    'type' => 'LEFT',
                    'conditions' => array(
                        'InfluencesUser.influence_id' => $userInfluences, //$userInfluences contains the list of influences I want to do the restriction on
                        '`InfluencesUser`.`user_id` = `User`.`id`'
                    )
                )
            ),
            'group' => 'User.id',
            'order' => array('User__matches' => 'DESC'),
        ));


我手动加入InfluencesUser表格(我实际上不需要那个Influence,只需要 的列表influence_id)来制作一张大桌子。我只需要influence_id在表格上执行限制 () join,然后我可以执行我goup by的 ,count()并将count()字段附加到我的结果数组,这要感谢马克的回答

显然我更喜欢使用类似contain参数的东西,但它似乎不允许我做我join在这种特殊情况下可以实现的目标。

希望这可以为某些人节省一些时间。

于 2012-11-27T10:36:34.050 回答
0

子查询怎么样?

http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#sub-queries

我使用这种方法针对 HATBM 问题回答了一个问题。对于复杂的查询,这是一种有用的方法。

于 2012-11-26T16:59:37.513 回答