首页 > 解决方案 > 获取两个集合中存在的所有对象

问题描述

我正在构建一个 Laravel 页面,我想在该页面上显示课程列表。页面上应显示哪些课程由三个标准过滤(其中所有标准都应为真):

  1. 课程是活动的,即“where('active', true)”。很简单。
  2. 该课程是用户选择的曲目的一部分。模型是用belongsToMany() 设置的(它是多对多的关系),所以我可以通过一个简单的$track->lessons 来获得这些课程。
  3. 这就是棘手的地方。有些课程应该只对具有特定标题的用户可见(即标题和课程之间存在多对多)。我可以使用 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() 中使用它们不可能是这样做的好方法。

所以我可以很容易地获得曲目中的课程集合,并且我可以获得属于标题的课程集合,但是我如何获得这两个集合中存在的所有对象?

标签: laravellaravel-5eloquentlaravel-5.7

解决方案


而不是 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();

推荐阅读