使用Laravel的Eloquent模型;如何通过有morphMany
多态关系的列来订购查询?
说我有给定的表结构:
// table: images
+ -- + ------------ + -------------- + ----- + ----------- +
| id | imageable_id | imageable_type | views | upload_date |
+ -- + ------------ + -------------- + ----- + ----------- +
| 1 | 1 | User | 100 | 2016-16-06 |
| 2 | 3 | User | 200 | 2016-16-06 |
+ -- + ------------ + -------------- + ----- + ----------- +
// table: users
+ -- + ---- +
| id | name |
+ -- + ---- +
| 1 | Bob |
| 2 | Kat |
+ -- + ---- +
...我有一个具有User
多态关系的雄辩morphMany
模型。
如何根据今天上传的图片获得的观看次数来定位用户?
我自己已经尝试过这个问题并且无法找到解决方案。我最接近正确排序的是当我对此使用类似的查询时:
User::with([
'images' => function ($query) {
$query->where('upload_date', Carbon::today()->toDateString())
->orderBy('views', 'DESC');
}
])->get();
但是,在尝试此操作后,我很明显,用户现在按其递增ID排序错误,而不是views
表上的images
列。
提前感谢任何帮我解决问题的人。
答案 0 :(得分:3)
或者,您也可以使用集合' sortBy
方法。
$users = User::with([
'images' => function ($query) {
$query->where('upload_date', Carbon::today()->toDateString());
}
])->get()->sortByDesc(function ($user) {
return $user->images->views;
});
答案 1 :(得分:1)
由于对此帖http://laravel.io/forum/02-21-2014-order-and-paginate-a-collection-by-a-releted-field-using-eloquent的评论,我想通了。
User::leftJoin('images', function ($join) {
$join->on('users.id', '=', 'images.imageable_id')
->where('imageable_type', '=', 'User')
->where('upload_date', '=', Carbon::today()->toDateString());
})
->orderBy('images.views')
->select(['players.*']);
之前我尝试过类似的东西,但遇到了问题,因为id和其他列在两个连接表之间发生冲突。这次的差异是->select(['users.*'])
。现在,只返回用户的数据。