使用Laravel/Eloquent订购相关型号

Ala*_*orm 5 php orm laravel

是否可以使用orderBy对象的相关模型?也就是说,假设我有一个Blog Post模型,hasMany("Comments"); 我可以用它来获取一个集合

$posts = BlogPost::all();
Run Code Online (Sandbox Code Playgroud)

然后浏览每个帖子,并显示评论的每个帖子的最后编辑日期

foreach($posts as $post)
{
    foreach($post->comments as $comment)
    {
        echo $comment->edited_date,"\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让我设置回复评论的顺序?

Jar*_*zyk 14

这是正确的方法:

BlogPost::with(['comments' => function ($q) {
  $q->orderBy('whatever');
}])->get();
Run Code Online (Sandbox Code Playgroud)


tot*_*dli 3

关系返回的对象是一个支持查询构建器功能的 Eloquent 实例,因此您可以在其上调用查询构建器方法。

foreach ($posts as $post) {
    foreach ($post->comments()->orderBy('edited_date')->get() as $comment) {
        echo $comment->edited_date,"\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,请记住,当您发布foreach()这样的所有帖子时,Laravel 必须运行查询来选择每次迭代中帖子的评论,因此建议像Jarek Tkaczyk 的答案中看到的那样急切地加载评论。

您还可以为有序评论创建一个独立的函数,就像您在这个问题中看到的那样。

public function comments() {
    return $this->hasMany('Comment')->orderBy('comments.edited_date');
}
Run Code Online (Sandbox Code Playgroud)

然后您可以像在原始代码中那样循环它们。