2014-04-02 40 views
0

我有一個CakePHP的2.4模型下面的查詢:CakePHP的發現( '名單')與彙總的數據返回空值

$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年3月24日'=>空
'2014年3月25日'=>空
'2014年3月26日'=>空
'2014年3月27日'=>空
'2014年3月28日'=>空
'2014-03-31'=>空

雖然結果我從MySQL控制檯粘貼此非常查詢得到的是:

'2014-03-24'=> 0
'2014年3月25日'=> 36
'2014年3月26日'=> 0
'2014年3月27日'=> 164
'2014年3月28日'=> 0
' 2014-03-31'=> 0

這是怎麼回事?假設相同的查詢輸出相同的結果,不是嗎?

我已經閱讀了關於爲此創建虛擬字段的一些內容,但我不想過分誇張,應該可以使用find函數通過Cakephp執行簡單的聚合查詢。

謝謝!

回答

1

好,可悲的是,我想你想做的事不能做你想做的事。讓我們看看,您使用find('list')方法,因此在API中使用here。代碼看起來很正常,正如你所說,查詢是好的,返回你想要的一切。問題是,在2883線

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

該行組織返回數組查詢完成後。而看到the doc該功能,我們有

創建使用$的keyPath爲路徑,以構建其 鍵的關聯數組,valuePath可選$的路徑得到的值。如果沒有指定 $ valuePath,或者不匹配任何內容,則值將被初始化爲空的 。

這是發生在你身上的事情。現在,調試,查詢結果之前應用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 
) 

這可能導致與括號內的點問題。而組合函數找不到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()你不會有運氣:(

+0

哇!真棒解釋我已經嘗試了你提到的「as score」,並且解釋了你的結果,非常感謝,我認爲這個問題是CakePHP開發者應該關注下一個版本的問題。我將使用find('all'),就像艾薩克拉吉建議的那樣,但至少現在我知道我爲什麼不能按自己的方式去做。 – patopato

2

試試這個

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

然後設置::結合起來,你可以格式化你的陣列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 
+0

我想堅持查找('列表')。我在其他地方見過這個解決方案,但與列表我不需要後處理數據。你的迴應 – patopato