Kohana 3 ORM:获取大多数重复值,排序并插入新对象/数组

时间:2011-01-25 19:23:43

标签: orm kohana-3 kohana-orm

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

基本上,我有一个名为connections的数据透视表。 connections表格将songkeyword相关联。这一切都很棒并且有效(感谢我最后两个问题!)

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

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

1 个答案:

答案 0 :(得分: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_id”和每个模型的'keyword_id'。