2012-02-13 18 views
1

Kohana ORMを使用してarticle.id = message.article_idに結合された関連テーブルの最新コメントでソートされた記事のリストを取得する必要があります。私はそのグループのクエリを構築するだけにしてORDERSするために管理:Kohana ORM、ORDER BYおよびGROUP BYクエリを書き直す

SELECT * 
FROM `articles` 
LEFT JOIN `comments` ON ( `articles`.`id` = `comments`.`article_id`) 
GROUP BY `comments`.`item_id` 
ORDER BY `datetime` DESC 

私が構築しようとしていますクエリは次のとおりです。

SELECT * FROM `articles` LEFT JOIN 
(SELECT article_id, MAX(datetime) as datetime FROM comments GROUP BY (article_id)) 
AS b ON `articles`.`id` = b.`article_id` 
ORDER BY datetime 

私はKohanaのORMにそれを書き換える方法が分かりません...

答えて

3
$subquery = DB::select('article_id', array('MAX("datetime")','datetime')) 
    ->from('comments') 
    ->group_by('article_id'); 

$s = ORM::factory('article') 
    ->join(array($subquery, 'b'), 'LEFT') 
    ->on('article.id','=','b.article_id') 
    ->order_by('datetime') 
    ->find_all(); 

これは、それが

を動作する場合、私は本当にわからないんだけど、あなたのクエリの翻訳である(それに依存したコードのトンがありますので、私はORMを回避することはできません)
+1

ありがとうございました。私の防衛では、Kohanaドキュメントは明らかにstate join()の最初のパラメータは文字列でなければならず、私はそれらを信じていました)。 – user1158010

1
ORM::factory('article')->join('comments', 'LEFT')->on('article.id', '=', 'comments.article_id')->group_by('comments.id')->order_by('date', 'DESC')->find_all()->as_array(); 

これは、SQLを生成する:

articleをSELECT * FROM articles LEFT article AS(article ON comments をJOIN。 id = commentsarticle_id)GROUP BY comments。あなたの最初のクエリに一致するdate DESC

BY id ORDER。

ORMでネストされたクエリを使用する方法はわかりませんが、kohanaにはQuery builderがあります。これはあなたのためのトリックです。