2011-01-25 11 views
0

だから、新しいオブジェクト/配列に挿入し、Kohanaの3 ORMの質問の私のシリーズ:)Kohanaの3 ORMは:ランク付けされ、ほとんどの繰り返しの値を、取得、および

内の別の私は、基本的に、ピボットテーブルは、connectionsと呼ばれています。 connectionsテーブルは、songkeywordに接続します。それはすべて素晴らしいです(私の最後の2つの質問のおかげで)

最も関連性の高い曲をキーワードで出力したいと思います。だから何とか私のconnectionsテーブルを照会して、曲数が接続されている順に並べ替えるオブジェクト(任意に制限された繰り返し回数を持つ$n)を出力します。特定のsong_idが表示された回数はkeyword_idです。

これを実現する方法は一言もありませんが、個々の行(!!!)を照会して配列内の個々の結果を数えることはありません。これを実現するにはもっとエレガントな方法が必要でしょうか?

答えて

2

これはSQLの質問の多くです。 DBクエリビルダを使用した:

DB::select('songs.*')->select(array('COUNT("keywords.id")', 'nconnections')) 
    ->from('songs') 
    ->join('connections', 'LEFT')->on('connections.song_id', '=', 'songs.id') 
    ->join('keywords', 'LEFT')->on('connections.keyword_id', '=', 'keywords.id') 
    ->group_by('songs.id') 
    ->order_by('nconnections') 
    ->as_object('Model_Song') 
    ->execute(); 

またはSQL

SELECT `songs`.*, COUNT(`keywords`.`id`) AS `nconnections` FROM songs 
    LEFT JOIN `connections` ON `connections`.`song_id` = `songs`.`id` 
    LEFT JOIN `keywords` ON `connections`.`keyword_id` = `keywords`.`id` 
GROUP BY `songs`.`id` ORDER BY `nconnections` 

には、あなたが望む結果を返す必要があります。

あなたの曲のモデルにはnconnectionsというアクセシブルなプロパティが必要です。これを行う最も簡単な方法は、ORMの内部動作を改ざんしないようにパブリックメンバーを追加することです。


私はあなたが「歌」テーブル「キーワード」テーブルに、外国「の接続」テーブルにリンクされ「キーワード」のモデルにリンクされている「歌」と呼ばれるモデルを、使用していると仮定していますキー 'song_id'と 'keyword_id'をそれぞれモデル毎に有する。

関連する問題