Laravel在多态表上按列排序

时间:2016-06-16 07:50:32

标签: php mysql eloquent laravel-5.2

简短的问题

使用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列。

提前感谢任何帮我解决问题的人。

2 个答案:

答案 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.*'])。现在,只返回用户的数据。