0

所以,我的 Kohana 3 ORM 问题系列中的另一个:)

本质上,我有一个数据透视表,名为connections. 该connections表将 a 连接song到 a keyword。这一切都很好并且有效(感谢我的最后两个问题!)

我想按关键字输出连接最多的歌曲。因此,以某种方式查询我的connections表并输出一个对象(具有任意限制的迭代次数$n),该对象按歌曲连接的次数对歌曲进行排名,即。song_id该特定项出现的次数keyword_id

我真的不知道如何实现这一点,而不查询每一行(!!!)然后在数组中计算这些单独的结果......必须有一种更优雅的方式来实现这一点?

4

1 回答 1

2

我相信这更像是一个 SQL 问题。使用数据库查询生成器:

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”的模型,链接到“歌曲”表,链接到“关键字”表的“关键字”模型以及“连接”表中的外键“song_id”和“keyword_id” ' 分别为每个模型。

于 2011-01-26T21:30:25.560 回答