我已经查看了许多答案,并且我的代码可以正常工作,但是没有产生预期的结果。
我有一个位置表和列表表。许多列表可以属于一个位置。
我想做的是获得一个特定的位置,结果应该包括所有关联的列表,但用户正在查看的列表除外。为此,我将$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
的列表。那会产生期望的结果,但是我想知道是否可以通过一个查询来产生这个结果。
答案 0 :(得分:0)
您应将with()
方法用于约束https://laravel.com/docs/5.7/eloquent-relationships#constraining-eager-loads。
$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的当前列表。