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
方法。因此,如果我理解正确,它可能也可以工作,但是它会急切加载与dog
s 关联的owner
s
@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