如何检查一条记录是否附加到另一条记录?

Ale*_*mia 3 laravel eloquent laravel-5 laravel-5.2

我已经定义了StudentSeminar模型之间的多对多关系。我如何确定某个学生是否正在参加某个研讨会?我想要实现的非工作示例如下所示:

$seminar->students()->contains($student->id);
Run Code Online (Sandbox Code Playgroud)

使用上面的代码片段时,显示以下错误:

BadMethodCallException,带有消息“调用未定义的方法Illuminate \ Database \ Query \ Builder :: contain()”

Mat*_*ald 6

请尝试:

$seminar->students->contains($student->id);
Run Code Online (Sandbox Code Playgroud)

假定$student包含Student模型的实例,您可以进一步简化它,只需使用:

$seminar->students->contains($student);
Run Code Online (Sandbox Code Playgroud)

添加括号时,您使用的是Laravel查询构建器,而您从未完成查询。要以您原来的方式进行操作,您需要:

$seminar->students()->get()->contains($student->id);
Run Code Online (Sandbox Code Playgroud)

如果要在获取学生时添加约束,则此方法可能很有用。

但通常您可以省略括号,并返回一个Collection,使您可以使用contains

这样做的另一个好处是,一旦加载了关系,就不必重新查询数据库,因此通常将是一种更为高效的获取关系的方法。

如果尚未加载学生并且想要一种有效的数据库检查方法,则可以使用:

$seminar->students()->where('students.id', $student->id)->exists();
Run Code Online (Sandbox Code Playgroud)


Tha*_*han 6

在您的情况下,例外情况是您在“查询生成器”上调用“contains()”函数(用于 Laravel Collection)。它应该是

$seminar->students->get()->contains($student->id);
Run Code Online (Sandbox Code Playgroud)

但这是低效的,因为这将检索研讨会的所有学生。

所以与其,

$seminar->students()->wherePivot('student_id', $student->id)->exists();
Run Code Online (Sandbox Code Playgroud)

此方法将检查特定研讨会-学生对的多对多关系的中间表,并返回是否存在。