laravel - 获取两个集合中存在的所有对象
问题描述
我正在构建一个 Laravel 页面,我想在该页面上显示课程列表。页面上应显示哪些课程由三个标准过滤(其中所有标准都应为真):
- 课程是活动的,即“where('active', true)”。很简单。
- 该课程是用户选择的曲目的一部分。模型是用belongsToMany() 设置的(它是多对多的关系),所以我可以通过一个简单的$track->lessons 来获得这些课程。
- 这就是棘手的地方。有些课程应该只对具有特定标题的用户可见(即标题和课程之间存在多对多)。我可以使用 Auth::user()->title->lessons 获得具有正确标题要求的课程。
问题是我如何将这一切整合在一起。到目前为止,我想出的最好的方法如下:
$title = Auth::user()->title;
$lessons = Lesson::where('active', true)
->whereIn('id', $track->lessons->pluck('id'))
->where(function ($query) use($title) {
$query->whereIn('id', $title->lessons->pluck('id'))->orWhere('limited_by_title', false);
})
->get();
...这很丑陋,显然不是最理想的,而且(出于某种原因我真的不明白)也不起作用(我没有得到我的头衔赋予我的课程在我的列表中)。现在已经挣扎了好几个小时,我觉得我过于复杂了,首先采摘 id 然后在 whereIn() 中使用它们不可能是这样做的好方法。
所以我可以很容易地获得曲目中的课程集合,并且我可以获得属于标题的课程集合,但是我如何获得这两个集合中存在的所有对象?
解决方案
而不是 where 使用 whereHas 对“标题”关系
$title = Auth::user()->title;
$lessons = Lesson::where('active', true)
->whereIn('id', $track->lessons->pluck('id'))
->whereHas('titles',function ($query) use($title) {
$query->whereIn('id', $title->pluck('id'))
->orWhere('limited_by_title', false);
})->get();
推荐阅读
- azure-devops - 使用容器的 Azure Pipeline 作业验证失败
- ios - Fastlane 没有看到 cocoapods 行动
- javascript - 此表达式不可构造
- java - 如何从 HTTP REST 调用中获取完整的 EntityResponse 对象?
- python - 了解以下创建变量的python代码
- .net - 使用 VS Code 时,我收到此错误消息“无法找到 .NET Core SDK。确保已安装 .NET Core SDK 并且在路径上
- vue.js - Nuxt/Strapi/Shopify-API:在 init 上加载数据时减少 nuxt 应用程序加载时间
- python - 在我的模板中出现我不理解的错误
- c - C 使用 pragma omp 时间优化问题
- javascript - 当 id 开头有字母时,如何按 id 对对象数组进行排序?