我在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执行简单的聚合查询。
谢谢!
答案 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()
,你将没有运气:(