Laravel雄辩的关系不在

时间:2018-12-10 11:04:52

标签: laravel laravel-5.7

我已经查看了许多答案,并且我的代码可以正常工作,但是没有产生预期的结果。

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

我想做的是获得一个特定的位置,结果应该包括所有关联的列表,但用户正在查看的列表除外。为此,我将$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的列表。那会产生期望的结果,但是我想知道是否可以通过一个查询来产生这个结果。

1 个答案:

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