Laravel 按 hasmany 关系排序

Laravel order by hasmany relationship

我有两个eloquent模型ThreadsComments,每个线程都有很多评论。

在列出线程时,我需要按 created_at 降序排列线程。所以,我需要在 Comments.

中使用 created at 对线程进行排序

显然点符号对以这种方式排序没有帮助,我该如何正确排序线程?

$Threads= Thread::all()->orderBy("comment.created_at","desc")

了解 Laravel 的预先加载是如何工作的很重要。如果我们急于加载您的示例,Laravel 首先获取所有线程。然后它获取所有评论并将它们添加到线程对象中。由于使用了单独的查询,因此无法按评论对线程进行排序。

您需要改用联接。请注意,在此示例中,我是在猜测您的 table/column 姓名。

$threads = Thread::leftJoin('comment', 'comment.thread_id', '=', 'thread.id')
    ->with('comments')
    ->orderBy('comment.created_at', 'desc')
    ->get();

由于您要加入,您可能需要手动指定列以 select 您的表列名称。

$threads = Thread::select('thread.*')->leftJoin('comment', 'comment.thread_id', '=', 'thread.id')
    ->with('comments')
    ->orderBy('comment.created_at', 'desc')
    ->get();
public function profiles()
{
    return $this->hasMany('Models\v1\Admin\UserProfile', 'user_id')->leftJoin('user_field', 'user_profile.user_field_id', '=', 'user_field.id')->orderBy('order');
}