我的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)等等....
此时我的查询将返回所有属性。
答案 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,其中全部为真。