如何为Laravel中的模型集合获取不同的相关模型列表

时间:2018-01-16 23:31:07

标签: laravel eloquent

考虑以下示例。 我们假设我们有一系列考试。 每个考试都可以有多个学生参加考试。

因此,在Exam模型上,我们创建了一个students关系,这样我就可以让所有学生参加任何考试。

现在出现以下问题:

  

我们如何获得参加任何考试的学生名单

基本上,我需要一份清晰的所有考试清单。

我说到我可以参加所有考试,并且急切地加载所有学生:

$exams = Exams::with('students')->where('somecondition', 'somevalue')->get();

现在我有点困惑的是获得一份独特的学生名单的最佳方式。我甚至不确定让学生参加所有这些考试的最佳方法是什么?该集合上的->each方法是否可行?

我已经尝试了很多东西,但它们要么过于复杂,要么难以理解,或者它们不能做我想要/需要的东西。

1 个答案:

答案 0 :(得分:1)

Eloquent拥有强大的whereHas方法。 鉴于您拥有多对多关系,您的代码将如下所示:

$students = Student::whereHas('exams', function($q) {
   $q->wherePivot('passed', 1);
})->get();

您可以在关闭时设置任意数量的条件。

同样has方法将返回“与考试相关的所有学生的列表”(任何考试):

$students = Student::has('exams')->get();

有关详细信息,请参阅"Querying Relations"部分中的“查询关系存在”部分。