Laravel Eloquent 多对多查询 whereIn

25

在我的应用程序中,我将一个关系从一对多更新为多对多,现在我正在尝试找到一种方法来保留相关的功能。

假设我有两个相关的表,比如dogs和owners。如果我有一个所有者数组,并且我想要获取这些所有者所拥有的狗的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();相同的方式适用于一对多关系,但适用于多对多

3个回答

68

使用whereHas()方法:

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

我应该选择whereHas还是with?在这种情况下它们之间有什么区别吗?它们是否真的有任何区别? - Angelin Calu
没关系,我在这里找到了解释:https://dev59.com/PF0a5IYBdhLWcg3whJDW#30232227 - Angelin Calu
@AngelinCalu,是的,with()对你来说不起作用,因为它会加载关联数据。 - Alexey Mezenin
我实际上还没有尝试过with方法,因为我所读到的内容。所以如果我理解正确的话,它可能也会起作用,但是它将急切地加载与dog相关联的owner - Angelin Calu
1
@AngelinCalu 不,with() 不会起作用。它会加载所有的狗和筛选出的主人。whereHas() 只会加载列表中有主人的狗。尝试一下两种方法,你就会看到区别了。 - Alexey Mezenin
1
在where子句中出现模糊的ID,有什么解决方案吗? - Sagar Gautam

3

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

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

2

尝试

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接