Laravel Eloquent关系在哪里不在



我已经查看了许多答案,我的代码正在运行,但它没有产生预期的结果。

我有一个位置表和列表表。许多列表可以属于一个位置。

我想做的是获得一个特定的位置,结果应该包括除了用户正在查看的列表之外的所有连接的列表。我将的$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的当前列表。

最新更新