2012-03-19 76 views
1

我正在爲使用CakePHP 1.2的系統編寫一個插件模塊,而我是框架新手。如何查詢Cake的方式?INNER JOIN與GROUP BY CakePHP方式

SELECT a.id, a.name, COUNT(a.id) AS comments 
FROM articles a LEFT JOIN comments c ON a.id = c.item_id 
GROUP BY a.id 
ORDER BY comments DESC; 

我不能編輯或條評論車型,但我在我的插件模型試圖這樣做,它不會產生相同的結果:

$this->loadModel('Article'); 
$options['fields'] = array('Article.id', 'Article.name', 
       'COUNT(Article.id) AS comments'); 
$options['joins'] = array(
    array('table' => 'comments', 
      'alias' => 'c', 
      'type' => 'INNER', 
      'conditions' => array(
      'Article.id = c.item_id') 
     )); 
$options['group'] = array('Article.id'); 
$options['order'] = 'comments DESC'; 
$options['limit'] = 5; 
$rows = $this->Article->find('all', $options); 

另外,我不敢肯定,但我認爲Article類可能已經有:

public $actsAs = array('Containable'); 
public $hasMany = array('Comment'); 
+0

在你的普通sql中你有一個'LEFT JOIN',在你定義'type => INNER'的Cake中。這是故意的嗎? – biziclop 2012-03-19 19:26:23

+0

我相信INNER更正確,你只用OUTER連接時使用左和右,但根據我的經驗,MySQL對待JOIN,LEFT JOIN和INNER JOIN全部完全相同 – 2012-03-20 17:42:20

+0

否,'INNER'和'LEFT'('LEFT OUTER')連接被區別對待。不過,如果你在連接表上添加更多的條件到WHERE子句,mysql會把一個'LEFT JOIN'作爲'INNER JOIN'。 – bfavaretto 2012-03-20 18:17:06

回答

1

很意外的答案:

的CakePHP的該使用的版本項目(我無能爲力)是在2008-01-02發佈的版本1.2.0.6311測試版,並且根據this article,Cake的模型查找方法中的功能組僅在2008年5月添加了

+0

哈!我從來沒有想過這一個!所以你必須更新Cake,或者忘記「蛋糕方式」,只需用'Model :: query'運行你的查詢。 – bfavaretto 2012-03-21 15:08:31

+0

是的,我清理我的參數並使用$ this-> query(...) – 2012-03-21 19:32:04

3

我想你也需要添加foreignKey => FALSE到您的加入定義:

$options['joins'] = array(
    array('table' => 'comments', 
      'alias' => 'c', 
      'type' => 'INNER', 
      'foreignKey' => FALSE, 
      'conditions' => array('Article.id = c.item_id') 
    ) 
); 

另外,如果你正迫使加入你自己,你應該擺脫以往任何蛋糕式的社團,無論是通過傳遞recursive => FALSE作爲一個選項,或者通過應用unbindModel到每個相關的模型。

UPDATE

根據你的評論說,這裏是什麼,我想你需要:

$options['fields'] = array(
    'Article.id', 
    'Article.name', 
    'COUNT(DISTINCT c.id) AS comments' 
); 
$options['joins'] = array(
    array(
     'table' => 'comments', 
     'alias' => 'c', 
     'type' => 'LEFT OUTER', 
     'foreignKey' => FALSE, 
     'conditions' => array('Article.id = c.item_id') 
    ) 
); 
$options['group'] = array('Article.id'); 
$options['order'] = 'COUNT(DISTINCT c.id) DESC'; 
$rows = $this->Article->find('all', $options); 
+0

對不起,我已經嘗試了所有三個建議,但沒有運氣。只有一行被返回並且它有錯誤的註釋數量。 – 2012-03-20 18:03:22

+0

@JannieT,請看我更新的答案。 – bfavaretto 2012-03-20 18:13:42

+0

對不起,沒有骰子。 – 2012-03-21 06:32:32