【发布时间】:2012-12-27 07:42:07
【问题描述】:
我使用 Eloquent ORM 已经有一段时间了,我很了解它,但是我不能做以下事情,而 在 Fluent 中很容易做到。
我的用户拥有多对多歌曲,中间表是 song_user(应该是这样)。从播放次数来看,我想获得用户的热门歌曲。当然,播放次数存储在中间表中。
我可以用 Fluent 做到这一点:
$songs = DB::table('songs')
->join('song_user', 'songs.id', '=', 'song_user.song_id')
->where('song_user.user_id', '=', $user->id)
->orderBy("song_user.play_count", "desc")
->get();
简单。但我想用 Eloquent 来做,这当然行不通:
$songs = Song::
with(array("song_user" => function($query) use ($user) {
$query->where("user_id", "=", $user->id)->orderBy("play_count", "desc");
}))
【问题讨论】:
-
我没有设置来试用它,但是您尝试过类似
$songs = $usr->songs()->pivot()->order_by('play_count','desc')->songs();的方法吗?问题是您是否可以在数据透视表之后“返回”songs,因为它似乎不是一个正常的模型。 -
这行不通,很遗憾。
-
好吧,您总是可以将数据透视表设为 模型 并完成它。您只需要设置额外的外键,以便在它们各自的父项存在时正确删除条目。
-
我目前正在这样做,但是使用这种方法,您将失去对用户歌曲的自动过滤($user->songs()),您必须记住手动执行此操作(@987654325 @)。
-
为什么,这就是关系的用途,而不是一对多,而是与数据透视表建立两个一对多的关系。你只需添加类似
$this->has_many('song_user')