Laravel Eloquent 多对多查询 whereIn

Posted

技术标签:

【中文标题】Laravel Eloquent 多对多查询 whereIn【英文标题】:Laravel Eloquent Many-to-Many query 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

【问题讨论】:

【参考方案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 吗?在这种情况下,它们之间有什么区别?它甚至有什么不同吗? 没关系,我在这里找到了解释:***.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();

【讨论】:

以上是关于Laravel Eloquent 多对多查询 whereIn的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 多对多查询 whereIn

Laravel eloquent 检查不存在的多对多关系

从父多对多关系获取所有子模型 Laravel Eloquent

Laravel Eloquent: hasManyThrough 多对多关系

Laravel Eloquent 多对多 [编辑]

Laravel Eloquent 多对多,增量依赖