如何解决Laravel:结合使用 order by 和 whereHas
我想检索一组数据,按关系的 start_date
排序
基本上我想用 Laravel 模型来实现这一点(下面的代码完美无缺)
$posts = DB::table('posts')
->leftJoin(
'threads','posts.id','=','threads.postable_id'
)
->where('threads.postable_type','App\Post')
->orderBy('threads.start_date')
->paginate($request->input('limit',2));
因此,在这种情况下,我将获取所有帖子,并且这些帖子按线程关系的 start_date 排序。
那些不是我的实际表格,但效果很好!
因为我使用的是 https://laravel.com/docs/8.x/eloquent-resources 这不是检索排序数据的理想解决方案。
所以我想在此处的某处使用 orderBy
子句
$posts = Post::whereHas('thread',function ($query) {
$query->where('end_date','>=',Carbon::Now());
});
但我就是做不到这一点。我试过了
$posts = Post::whereHas('thread',Carbon::Now())
->orderBy('start_date');
});
而且我还将其附加到实际关系中:
public function thread(): MorphOne
{
return $this->morphOne('App\Thread','postable')->orderBy('start_date');
}
解决方法
如果您查看代码:
$posts = Post::whereHas('thread',function ($query) {
$query->where('end_date','>=',Carbon::now())
->orderBy('start_date');
});
whereHas 只会返回与函数返回 true 的线程关联的 Post。
试试这个:
$posts = Post::with('thread')->has('thread')->orderBy('thread.start_date')->get();
只有当它们至少有一个 Thread 时,这才会获取所有带有 Thread 的 Post,然后按该 Thread 的 start_date 排序。
您不必执行 whereHas 函数,因为当您调用 ->with('thread')
时,它会使用您:
public function thread(): MorphOne
{
return $this->morphOne('App\Thread','postable')->orderBy('start_date');
}
whereHas 没有检索到关系。
如果您需要更多功能,您可以使用 whereHas 和 orWhereHas 方法为您的 has 查询定义额外的查询约束,例如检查评论的内容:Laravel whereHas
不要这样做:
$posts = Post::with('thread')->orderBy('thread.start_date');
如果某个帖子没有线程,那么没有线程的帖子将被抓取,其关键线程的值为 null,并且当您尝试 orderBy 时会出现意外结果。
,首先,我要感谢 Elie Morin 的帮助,但我发现我绝对需要使用连接来完成这项任务。
在我的示例中,我想通过关系的 start_date
按照你的建议去做
$posts = Post::with('thread')->has('thread')->orderBy('thread.start_date')->get();
只会按 start_date
而不是 ENTIRE 查询对线程进行排序。
这就是为什么我想出了这样的东西:
$posts = Post::has('thread')
->select('posts.id')
->leftJoin(
'thread','posts.id','=','thread.postable_id'
)
->where('thread.postable_type','App\Post')
->where('thread.end_date',Carbon::now())
->orderBy('thread.start_date')
->with('thread');
return PostResource::collection($posts->paginate(2));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。