Php 使用Laravel/Elount订购相关模型
是否可以对对象的相关模型使用orderBy?也就是说,假设我有一个博客帖子模型,其中包含大量的内容;我可以用它来取收藏品Php 使用Laravel/Elount订购相关模型,php,laravel,orm,Php,Laravel,Orm,是否可以对对象的相关模型使用orderBy?也就是说,假设我有一个博客帖子模型,其中包含大量的内容;我可以用它来取收藏品 $posts = BlogPost::all(); 然后浏览每篇文章,并显示每篇文章最后编辑的日期 foreach($posts as $post) { foreach($post->comments as $comment) { echo $comment->edited_date,"\n"; } } 有没有办法设置返
$posts = BlogPost::all();
然后浏览每篇文章,并显示每篇文章最后编辑的日期
foreach($posts as $post)
{
foreach($post->comments as $comment)
{
echo $comment->edited_date,"\n";
}
}
有没有办法设置返回注释的顺序?是:
$posts = BlogPost::with('comments')
->orderBy('comments_table_name.column_name')
->get();
您还可以在关系中设置:
public comments()
{
$this->hasMany("Comments")->orderBy('comments.column_name');
}
从关系返回的对象是一个支持查询生成器功能的雄辩实例,因此可以对其调用查询生成器方法 foreach$posts作为$post{ foreach$post->comments->orderBy'edited_date'->获取为$comment{ echo$comment->编辑的\u日期,\n; } } 此外,请记住,当您对所有这样的帖子进行foreach时,Laravel必须运行一个查询来为每个迭代中的帖子选择注释,因此建议使用您在中看到的注释 您还可以为有序注释创建一个独立函数,如中所示 公共职能评论{ return$this->hasMany'Comment'->orderBy'comments.edited_date'; }
然后您可以像在原始代码中那样循环它们。这是正确的方法:
BlogPost::with(['comments' => function ($q) {
$q->orderBy('whatever');
}])->get();
创建联接并仅选择要订购的列:
$post = BlogPost::join('comments', function($j) {
$j->on('posts.id', '=', 'comments.post_id');
$j->select('comment_date_or_other_col');
})
->orderBy('comment_date_or_other_col', 'DESC')->first();
啊,我错过了get——而且,这不应该是对comments方法的调用吗?如果我尝试使用magic属性,我会调用undefined方法illumb\Database\Eloquent\Collection::orderBy+1 for with-我还没有看到那个pne。然而,orderBy似乎应用于第一个查询select*from blog_posts,而不是第二个查询。应用order by是否有不同的语法和/或是否需要以某种方式设置关系?在这里引用BlogPost::with code,而不是直接向relations添加内容这是错误的,您不能像这样引用相关表,因为在应用orderby的主查询中没有使用它。这确实是正确的方法!如果您需要灵活地设置每个查询的顺序,那么这是唯一一个不会对每个项目进行新查询的解决方案。这绝对是可以接受的答案。