我已经查看了许多答案,我的代码正在运行,但它没有产生预期的结果。
我有一个位置表和列表表。许多列表可以属于一个位置。
我想做的是获得一个特定的位置,结果应该包括除了用户正在查看的列表之外的所有连接的列表。我将的$listing_id
传递给子查询,但问题是$location_other_listings
仍然包括该列表(在下面的$listing_id = 3
示例中(。
$listing_id = 3;
$location_other_listings = Location::whereHas('listings', function ($query) use($listing_id) {
$query->where('id', '!=', $listing_id);
})
->where('id', $location_id)
->first();
更新:
我也尝试了相反的方法(whereDoesntHave
和=
而不是!=
(:
$listing_id = 3;
$location_other_listings = Location::whereDoesntHave('listings', function ($query) use($listing_id) {
$query->where('id', '=', $listing_id);
})
->where('id', $location_id)
->first();
但这会为我所有不同的列表生成NULL。不知道为什么。
如前所述,第一个查询有效。所以我可以做的是:当$location_other_listings
为空时,我知道没有其他列表连接。如果它不为空,我可以从结果数组中删除具有当前listing_id
的列表。这将产生所需的结果,但是我想知道是否可以用一个查询产生这个结果。
您应该使用带约束的with()
方法https://laravel.com/docs/5.7/eloquent-relationships#constraining-急切的负载。
$listing_id = 3;
$location_other_listings = Location::with([
'listings' => function($query) use ($listing_id){
$query->where('id', '!=', $listing_id);
}
])
->where('id', $location_id)
->first();
那么$location_other_listings->listings将不包含id为3的当前列表。