2016-10-12 70 views
0

我的belongstoMany關係在我的Property模型上。Laravel哪裏有查詢不會返回相關結果

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

然後在我的post方法我有那些PARAMS:

$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(); 

所以在自然語言,我想有金屬門(具有狀態1 amenity_id 1)所有屬性和做沒有Hone(amenity_id 2的狀態爲0)等等。

在這一刻我的查詢返回所有屬性。

回答

-1

爲什麼不插入properties_amenities哪裏都是真的。

+1

這不會返回基於'$ amenities'參數的屬性。 –

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); 
     }); 
    } 
}); 

我沒有測試過這所以我不確定拉拉維爾是否足夠聰明,知道第一個orWhere應該是一個地方。在開始循環使用設施之前,您可能需要添加->where(DB::raw(1), 1),這樣Laravel將開始用where 1 = 1構建查詢,然後它可以繼續執行or的其餘部分。