Laravel Eloquent-按联接表上的列进行排序
这个来自Laravel文档的示例将在用户内部通过创建来订购帖子Laravel Eloquent-按联接表上的列进行排序,laravel,eloquent,Laravel,Eloquent,这个来自Laravel文档的示例将在用户内部通过创建来订购帖子 $users = App\User::with(['posts' => function ($query) { $query->orderBy('created_at', 'desc'); }])->get(); 我该如何扭转这一局面,以便用户在发布的日期由创建的_进行排序?也就是说,我想按最新帖子的用户排序。我回答了类似的问题。您只需在任何关系定义之后执行orderBy public function
$users = App\User::with(['posts' => function ($query) {
$query->orderBy('created_at', 'desc');
}])->get();
我该如何扭转这一局面,以便用户在发布的日期由创建的_进行排序?也就是说,我想按最新帖子的用户排序。我回答了类似的问题。您只需在任何关系定义之后执行
orderBy
public function relation()
{
return $this->hasMany('App\Models\Related', 'foreign_key', 'local_id')
->orderBy('id', 'ASC');
}
这两个答案似乎都不能真正回答问题 可以使用雄辩关系对子模型进行排序,但不能使用具有雄辩关系的子模型的属性对父模型进行排序。你需要用这个 例如:
$users = App\User::selectRaw('users.*, MAX(posts.created_at) as latest_post_timestamp')
->join('posts', 'posts.user_id', '=', 'users.id')
->groupBy('users.id')
->orderBy('latest_post_timestamp', 'DESC')
->get();
加入posts和users表。选择所有用户属性+帖子的max created_at属性,我将其别名为“latest_post_timestamp”。我使用此别名对结果进行排序
这不会立即加载帖子,因此如果您仍然需要这样做,只需添加如下方法:
$users = App\User::with('posts')
->selectRaw('users.*, MAX(posts.created_at) as latest_post_timestamp')
->join('posts', 'posts.user_id', '=', 'users.id')
->groupBy('users.id')
->orderBy('latest_post_timestamp', 'DESC')
->get();
这不仅仅是按id订购相关项目吗?在我的示例中,我想按照用户在日期创建的相关帖子对用户进行排序。您的示例没有更改用户返回的顺序,是吗?您是对的,该字段是无关的,但它只对关系数据进行排序。我会更新的。