【问题标题】:Laravel Eloquent Many-to-Many query whereInLaravel Eloquent 多对多查询 whereIn
【发布时间】:2017-07-30 04:57:35
【问题描述】:

在我的应用程序中,我已将关系从 one-to-many 更新为 many-to-many,并且我正在尝试找出一种方法来保持关联的功能。

假设我有两个相关的表,例如狗和主人。如果我有一组所有者,并且我正在尝试为这些所有者获取狗 id 的列表,我应该如何雄辩地做到这一点?

这里提出了类似的问题: https://laracasts.com/discuss/channels/laravel/getting-many-to-many-related-data-for-an-array-of-elements

那么,我如何获得 Dog 模型,其中 Owner 在数组中?

$associatedDogs = Dog::whereIn('owner_id',$ListOfOwners)->get(); 相同的是One-To-Many 关系,但Many-to-Many

【问题讨论】:

    标签: php laravel eloquent many-to-many


    【解决方案1】:

    我尝试了两种建议的解决方案,但收到一个错误,提示 id 不是唯一的。 我是这样解决的:

    $dogs = Dog::whereHas('owners', function($q) use($ownerIds) {
        $q->whereIn('owner_id', $ownerIds);
    })->get();
    

    【讨论】:

      【解决方案2】:

      使用whereHas() 方法:

      $dogs = Dog::whereHas('owners', function($q) use($ownerIds) {
          $q->whereIn('id', $ownerIds);
      })->get();
      

      【讨论】:

      • 我应该选择whereHas 而不是with 吗?在这种情况下,它们之间有什么区别?它甚至有什么不同吗?
      • 没关系,我在这里找到了解释:stackoverflow.com/a/30232227/2012740
      • @AngelinCalu 是的,with() 不适合你,因为它会加载关系数据。
      • @ 由于我读过的内容,我实际上还没有尝试过with 方法。因此,如果我理解正确,它可能也可以工作,但是它会急切加载与dogs 关联的owners
      • @AngelinCalu no with() 将不起作用。它将加载所有狗和过滤的所有者。 whereHas() 将仅加载具有列表中所有者的狗。两者都试一下,你就会发现不同。
      【解决方案3】:

      试试

      $associateDogs = Dog::with(['owners' => function($query) use ($listOfOwners) {
          $query->whereIn('id', $listOfOwners);
      }])->get();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-19
        • 2017-11-03
        • 1970-01-01
        • 1970-01-01
        • 2011-01-21
        • 2021-05-12
        • 1970-01-01
        • 2018-01-30
        相关资源
        最近更新 更多