Laravel按hasmany关系排序

Posted

技术标签:

【中文标题】Laravel按hasmany关系排序【英文标题】:Laravel order by hasmany relationship 【发布时间】:2015-04-22 11:35:05 【问题描述】:

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

在列出线程时,我需要按 created_at 降序对线程进行排序。所以,我需要在Comments 中使用created at 对线程进行排序。

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

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

【问题讨论】:

您的问题是什么?你试过什么? @TerryJanReedy orderBy ,显然点符号在 orderBy("cmets.created_at"."desc") 中不起作用 您想如何排序?一个线程有来自 1.01.2014 和 1.03.2014 的评论,第二个线程有来自 2.01.2015 和 2.02.2015 的线程 - 哪个应该是第一个? 【参考方案1】:
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');

【讨论】:

【参考方案2】:

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

您需要改为使用联接。请注意,我在此示例中猜测您的表/列名称。

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

由于您要加入,您可能需要手动指定列来选择表格的列名。

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

【讨论】:

以上是关于Laravel按hasmany关系排序的主要内容,如果未能解决你的问题,请参考以下文章

laravel 关系集合上的自定义排序

Laravel 延迟加载的问题

Laravel 关系查询加载 hasMany + BelongsToMany

Laravel 5.8 中 hasMany 关系的条件

使用 Eloquent Laravel 获取 hasMany 关系

Laravel 关系,hasmany 和 blongstomany