Laravel Eloquent 关系不在
Laravel Eloquent relationship where not in
我已经查看了很多答案,我的代码可以正常工作,但没有产生预期的结果。
我有地点 table 和列表 table。许多列表可以属于一个位置。
我想做的是获取一个特定位置,结果应该包括除用户正在查看的列表之外的所有关联列表。为此,我将 $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
的列表。这将产生所需的结果,但是我想知道我是否可以通过一个查询产生这个结果。
您应该使用具有约束 https://laravel.com/docs/5.7/eloquent-relationships#constraining-eager-loads 的 with()
方法。
$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->列表将不包含 ID 为 3 的当前列表。
我已经查看了很多答案,我的代码可以正常工作,但没有产生预期的结果。
我有地点 table 和列表 table。许多列表可以属于一个位置。
我想做的是获取一个特定位置,结果应该包括除用户正在查看的列表之外的所有关联列表。为此,我将 $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
的列表。这将产生所需的结果,但是我想知道我是否可以通过一个查询产生这个结果。
您应该使用具有约束 https://laravel.com/docs/5.7/eloquent-relationships#constraining-eager-loads 的 with()
方法。
$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->列表将不包含 ID 为 3 的当前列表。