0

それで、私の一連の Kohana 3 ORM の質問のもう 1 つ:)

基本的に、 と呼ばれるピボット テーブルがありますconnectionsconnectionsテーブルは を に接続しsongますkeyword。それはすべて素晴らしく、機能しています(最後の2つの質問に感謝します!)

キーワード別のつながりの多い曲を出力したい。したがって、どういうわけか私のテーブルにクエリを実行し、接続された回数で曲をランク付けconnectionsするオブジェクトを(任意に制限された反復回数で)出力します。その特定の特定の出現$n回数。song_idkeyword_id

すべての行をクエリし (!!!)、配列内の個々の結果をカウントすることなく、これを達成する方法が文字通りわかりません....これを達成するためのよりエレガントな方法が必要ですか?

4

1 に答える 1

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 の内部動作を改ざんしないようにすることです。


「songs」テーブルにリンクされた「Song」というモデル、「keywords」テーブルにリンクされた「Keyword」モデル、および「connections」テーブルの外部キー「song_id」および「keyword_id」を使用していると仮定しています' 各モデルごとにそれぞれ。

于 2011-01-26T21:30:25.560 に答える