我已经定义了Student
和Seminar
模型之间的多对多关系。我怎样才能知道某个学生是否参加了某个特定的研讨会?我想要实现的非工作示例如下所示:
$seminar->students()->contains($student->id);
使用上面的代码段时显示以下错误:
BadMethodCallException,带有消息'调用未定义的方法Illuminate \ Database \ Query \ Builder :: contains()'
尝试改为:
$seminar->students->contains($student->id);
假设$student
包含Student
模型的一个实例,您可以进一步简化它并使用:
$seminar->students->contains($student);
添加括号时,您正在使用Laravel查询构建器,并且您从未完成查询。要按照原来的方式进行,您需要:
$seminar->students()->get()->contains($student->id);
如果要在获取学生时添加约束,此方法可能很有用。
但通常你可以省略括号并返回一个Collection,允许你使用像contains
这样的方法。
这具有在加载关系后不重新查询数据库的额外好处,因此通常是获取关系的更有效的方法。
如果您尚未加载学生并希望使用数据库高效的检查方法,则可以使用:
$seminar->students()->where('students.id', $student->id)->exists();
在您的情况下,例外是您在“查询生成器”上调用'contains()'函数(用于Laravel Collection)。它应该是
$seminar->students->get()->contains($student->id);
但这是低效的,因为这将检索研讨会的所有学生。
所以与其,
$seminar->students()->wherePivot('student_id', $student->id)->exists();
对于特定研讨会 - 学生对,此方法将检查多对多关系的中间表,并将返回是否存在。
接受的答案是错误的。 $seminar->students()->exists($student->id)
不会检查这种关系是否存在。它只检查学生是否存在。学生可以参加任何研讨会,但仍然可以返回。
在没有从数据库中提取记录的情况下检查关系是否存在的正确方法是:
$seminar->students()->whereId($student->id)->exists()