2012-03-19 9 views
1

私はCakePHP 1.2を使用するシステム用のプラグインモジュールを作成しています。私はこのフレームワークを初めて使用しています。どのようにケーキの方法で次のクエリを実行しますか?CakePHPの方法でGROUPを使ったINNER JOIN

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); 

を、I 「よく分からないが、私は記事のクラスが既に持っているかもしれないと思う:

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

普通のSQLでは、あなたは 'LEFT JOIN'を持っていますが、Cakeでは' type => INNER'を定義します。それは意図的ですか? – biziclop

+0

INNERはより正確で、OUTER結合でのみLEFTとRIGHTを使用しますが、MySQLではJOIN、LEFT JOIN、INNER JOINがすべて同じものとして扱われます –

+0

いいえ、 'INNER'と' LEFT'( 'LEFT OUTER')結合異なって扱われる。しかし、結合されたテーブルの条件をWHERE句に追加すると、mysqlは 'LEFT JOIN'を' INNER JOIN'として処理します。 – bfavaretto

答えて

1

非常に予想外の答えを:

これによって使用されるのCakePHPのバージョンプロジェクト(私は何もできません)は、2008年1月2日にリリースされたバージョン1.2.0.6311ベータ版で、this articleによると、Cakeのモデル検索機能のグループは2008年5月にのみ追加されました

+0

ハ!私は決してそれを理解しませんでした!だから、Cakeを更新したり、 "ケーキのやり方"を忘れて、単純に 'Model :: query'でクエリを実行しなければなりません。 – bfavaretto

+0

はい、私は自分のパラメータを消毒し、$ this-> query(...)を使います。 –

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

申し訳ありませんが、私は3つの提案をすべて試してみました。 1行だけが返され、コメントカウントが間違っています。 –

+0

@ JannieT、私の更新された答えをご覧ください。 – bfavaretto

+0

申し訳ありませんが、サイコロはありません。 –