Laravel whereHas查询不返回相关结果

时间:2016-10-12 12:27:44

标签: php laravel eloquent

我的belongstoMany型号上有Property个关系。

public function amenities()
{
    return $this->belongsToMany('App\Amenity', 'property_amenities', 'property_id', 'amenity_id')
        ->withPivot('status');
}

然后在我的post方法中,我有这些参数:

 $amenities = Array
        (
            [1] => 1
            [2] => 0
            [3] => 1
            [25] => 0
            [26] => 0
        )

其中键是设施ID,值为true或false(布尔值)。

根据这些信息,我试图查询相关结果,以便构建此查询:

    $properties = Property::whereHas('amenities', function($query) use($amenities){
        foreach($amenities as $amenityID=>$status)
        {
            $query->where('property_amenities.id', $amenityID);
            $query->where('property_amenities.status', $status);
        }
    });
return $properties->get();

因此,在自然语言中,我希望所有具有Metal Door的属性(amenity_id 1的状态为1)并且没有Hone(amenity_id 2的状态为0)等等....

此时我的查询将返回所有属性。

2 个答案:

答案 0 :(得分:0)

您构建查询的方式,它看起来像以下......

... 
where property_amenities.id = 1 
and property_amenities.status = 1
and property_amenities.id = 2
and property_amenities.status = 0
and property_amenities.id = 3
and property_amenities.status = 1
...

如你所见,这并没有多大意义。我认为你想要它做的更像是以下......

... 
where ( property_amenities.id = 1 and property_amenities.status = 1 )
or ( property_amenities.id = 2 and property_amenities.status = 0 )
or ( property_amenities.id = 3 and property_amenities.status = 1 )
...

为了使用查询构建器完成此操作...

$properties = Property::whereHas('amenities', function($query) use($amenities) {
    foreach ($amenities as $amenityID => $status) {
        $query->orWhere(function($q) use ($amenityID, $status) {
            $q
                ->where('property_amenities.id', $amenityID)
                ->where('property_amenities.status', $status);
        });
    }
});

我还没有对此进行过测试,所以我不确定Laravel是否足够聪明,知道第一个orWhere应该在哪里。在开始循环使用便利设施之前,您可能需要添加->where(DB::raw(1), 1),这样Laravel才会开始使用where 1 = 1构建查询,然后它可以继续执行or的剩余部分第

答案 1 :(得分:-1)

为什么不直接插入properties_amenities,其中全部为真。