所以,在我的Kohana 3 ORM问题系列中的另一个问题:)
基本上,我有一个名为connections
的数据透视表。 connections
表格将song
与keyword
相关联。这一切都很棒并且有效(感谢我最后两个问题!)
我想按关键字输出连接最多的歌曲。因此,以某种方式查询我的connections
表并输出一个对象(具有任意有限的迭代次数$n
),该对象按照它们连接的次数对歌曲进行排名,即。特定song_id
的特定keyword_id
出现的次数。
我真的不知道如何实现这一点,不查询每一行(!!!)然后在数组中计算那些单独的结果......必须有一种更优雅的方法来实现这一目标吗?
答案 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'。