Laravel Eloquent - 按联合表格上的列排序

时间:2015-12-16 17:02:04

标签: laravel eloquent

Laravel文档中的这个示例将按用户在created_at中对帖子进行排序。

wordFunction = edu.stanford.nlp.process.AmericanizeFunction

我如何转过来,以便用户按帖子上的created_at日期排序?即我想通过最新帖子的用户订购用户。

2 个答案:

答案 0 :(得分:1)

我已经回答了类似in this question的问题。您可以在任何关系定义后执行orderBy

public function relation()
{
    return $this->hasMany('App\Models\Related', 'foreign_key', 'local_id')
                ->orderBy('id', 'ASC');
}

答案 1 :(得分:0)

似乎任何一个答案都没有回答问题。

您可以使用Eloquent关系对子模型进行排序,但不能使用具有Eloquent关系的子模型的属性对父模型进行排序。您需要使用joins

例如:

$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();

加入帖子和用户表。选择所有用户属性+帖子的max created_at属性,我将其别名为“latest_post_timestamp”。我使用这个别名来命令结果。

这不会急于加载帖子,所以如果您仍然需要这样做,那么只需添加with方法,如下所示:

$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();