首页 文章

Laravel Eloquent关系不在哪里

提问于
浏览
0

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

我有一个位置表和列表表 . 许多商家信息可以属于一个位置 .

我想要做的是获取一个特定的位置,结果应该包括所有连接的列表,除了用户正在查看的列表 . 我将 $listing_id for传递给子查询,但问题是 $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();

Update:

我也尝试了反向( 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

    您应该使用带有约束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-> listing将不包含id为3的当前列表 .

相关问题