考虑以下示例。 我们假设我们有一系列考试。 每个考试都可以有多个学生参加考试。
因此,在Exam
模型上,我们创建了一个students
关系,这样我就可以让所有学生参加任何考试。
现在出现以下问题:
我们如何获得参加任何考试的学生名单
基本上,我需要一份清晰的所有考试清单。
我说到我可以参加所有考试,并且急切地加载所有学生:
$exams = Exams::with('students')->where('somecondition', 'somevalue')->get();
现在我有点困惑的是获得一份独特的学生名单的最佳方式。我甚至不确定让学生参加所有这些考试的最佳方法是什么?该集合上的->each
方法是否可行?
我已经尝试了很多东西,但它们要么过于复杂,要么难以理解,或者它们不能做我想要/需要的东西。
答案 0 :(得分:1)
Eloquent拥有强大的whereHas
方法。
鉴于您拥有多对多关系,您的代码将如下所示:
$students = Student::whereHas('exams', function($q) {
$q->wherePivot('passed', 1);
})->get();
您可以在关闭时设置任意数量的条件。
同样has
方法将返回“与考试相关的所有学生的列表”(任何考试):
$students = Student::has('exams')->get();
有关详细信息,请参阅"Querying Relations"部分中的“查询关系存在”部分。