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-loadswith() 方法。

$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 的当前列表。