【问题标题】:How to check if one record is attached to another?如何检查一条记录是否附加到另一条记录?
【发布时间】:2016-05-10 14:59:37
【问题描述】:

我已经定义了StudentSeminar 模型之间的多对多关系。我怎样才能知道一个特定的学生是否正在参加一个特定的研讨会?我想要实现的非工作示例如下所示:

$seminar->students()->contains($student->id);

使用上述代码sn-p时出现如下错误:

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

【问题讨论】:

    标签: laravel laravel-5 eloquent laravel-5.2


    【解决方案1】:

    试试吧:

    $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();
    

    【讨论】:

    • 感谢您的回答。这不会给数据库带来不必要的负载吗?因为它从数据库中检索给定$seminar 的所有学生,然后才使用contains() 来检查数组
    • 是的。在这种情况下,您不能使用 contains,因为它是一个 Collection 方法。你需要类似:$seminar->students()->exists($student -> id);
    • 谢谢,exists() 方法正是我想要的
    • @MattMcDonald 我也有一个类似的问题,你认为我可以在 if 语句中以某种方式使用 $seminar->students()->exists($student->id); 吗?我以前从未使用过多对多,所以我遇到了很多麻烦。
    • 不确定这是否在 laravel 中发生了变化,但 exists() 从 5.7 开始不接受任何参数。最后一个代码示例将忽略该参数并进行数据库调用以检查研讨会中是否存在任何学生,而不仅仅是特定的。
    【解决方案2】:

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

    $seminar->students->get()->contains($student->id);
    

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

    所以,

    $seminar->students()->wherePivot('student_id', $student->id)->exists();
    

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

    【讨论】:

      【解决方案3】:

      接受的答案是错误的。 $seminar->students()->exists($student->id) 不检查关系是否存在。它只检查学生是否存在。该学生可以属于任何研讨会,它仍然会返回 true。

      在不从数据库中获取记录的情况下检查关系是否存在的正确方法是:

      $seminar->students()->whereId($student->id)->exists()

      【讨论】:

      • $seminar->students()->exists($student->id)$seminar->students->exists($student->id) 做非常不同的事情 - 请注意解决方案中没有 ()
      猜你喜欢
      • 2019-09-30
      • 2014-02-02
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 2012-06-14
      • 2021-08-28
      相关资源
      最近更新 更多