Cakephp查找(' list'),汇总数据返回null

时间:2014-04-02 11:53:46

标签: mysql list cakephp find sum

我在Cakephp 2.4模型中有以下查询:

  

$scores = $this->WorkInfo->find('list', array( 'conditions' => array('WorkInfo.work_id' => $work_ids), 'fields' => array('WorkInfo.date', 'SUM(WorkInfo.score)'), 'group' => array('WorkInfo.date') ));

生成以下查询:

SELECT 
  `WorkInfo`.`date`, 
   SUM(`WorkInfo`.`score`) 
FROM 
   `home`.`work_infos` AS `WorkInfo` 
WHERE 
   `WorkInfo`.`work_id` IN (4, 7, 8, 12, 9, 11, 13, 10, 14, 6, 5) 
GROUP BY 
   `WorkInfo`.`date`

我在申请表中得到的结果是:

  

'2014-03-24'=>空
    '2014-03-25'=>空
    '2014-03-26'=>空
    '2014-03-27'=>空
    '2014-03-28'=>空
    '2014-03-31'=>空

虽然我在mysql控制台中粘贴这个查询得到的结果是:

  

'2014-03-24'=> 0
    '2014-03-25'=> 36个
    '2014-03-26'=> 0
    '2014-03-27'=> 164个
    '2014-03-28'=> 0
    '2014-03-31'=> 0

这里发生了什么?假设相同的查询输出相同的结果,不是吗?

我已经阅读了有关为此创建虚拟字段的内容,但我不想过度使用,应该可以使用find函数通过Cakephp执行简单的聚合查询。

谢谢!

2 个答案:

答案 0 :(得分:2)

试试这个

$scores = $this->WorkInfo->find('all', array(
          'conditions' => array('work_id' => $work_ids),
          'fields' => array('date', 'SUM(score) AS score'),
          'group' => array('date')
      ));

然后使用Set :: combine,您可以格式化数组cakephp find list

$scores = Set::combine($scores, '{n}.WorkInfo.date', '{n}.0.score');

打印=>

'2014-03-24' => 0
'2014-03-25' => 36
'2014-03-26' => 0
'2014-03-27' => 164
'2014-03-28' => 0
'2014-03-31' => 0

答案 1 :(得分:1)

好吧,遗憾的是,我认为你想做的事情不能按照你想要的去做。

我们看一下,您使用find('list')方法,因此API中的here。代码看起来很正常,如你所说,查询正常,返回你想要的一切。问题在第2883行

return Hash::combine($results, $query['list']['keyPath'], $query['list']['valuePath'], $query['list']['groupPath']);

该行在查询完成后组织返回的数组。看到该函数的the doc,我们有

  

使用$ keyPath创建一个关联数组作为构建它的路径   键,以及$ valuePath作为获取值的路径。如果   $ valuePath未指定,或者不匹配任何值,值将是   初始化为null。

你发生了什么事。现在,调试,应用Hash::combine函数之前的查询结果是这样的

Array
(
    [0] => Array
        (
            [WorkInfo] => Array
                (
                    [date] => 2013-04-01
                )

            [0] => Array
                (
                    [SUM(`WorkInfo`.`score`)] => 24
                )

        )

)

所以你看,你得到的结果。以及相应的Hash::combine

Array
(
    [groupPath] => 
    [valuePath] => {n}.SUM(WorkInfo.score)
    [keyPath] => {n}.WorkInfo.date
)

这可能会导致括号内的点出现问题。并且combine函数找不到valuePath,并且你得到null,你会感到难过。

如果您将查询更改为'SUM(WorkInfo.score) AS score'(保留所有内容),则您对valuePath的问题几乎相同

Array
(
    [groupPath] => 
    [valuePath] => {n}.SUM(WorkInfo.score) as score
    [keyPath] => {n}.WorkInfo.date
)

 //respective result array
Array
(
    [0] => Array
        (
            [WorkInfo] => Array
                (
                    [date] => 2013-04-01
                )

            [0] => Array
                (
                    [score] => 24
                )

        )

)

您可能认为执行'SUM(score) AS score'(没有点)会解决它,但find('list')的代码会添加别名(如果找不到点)(第2865行)。

所以...我猜我所说的是:做一个虚拟领域,或者听Isaac Rajaei,或者创建一个custom find function。但是对于find('list')SUM(),你将没有运气:(