2016-10-12 30 views
0

私はPropertyモデルにbelongstoManyの関係を持っています。Laravel whereクエリが関連する結果を返しません

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

キーはアメニティIDであり、値が(ブール値)trueまたはfalseである:私はそれらのparamsを持っている私のpost方法に続いて

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

。私はこのクエリを構築するように、関連性の高い結果を照会しようとしています。この情報に基づいて

$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)を持っているとし、すべてのプロパティをしたいですホーン(状態0のamenity_id 2)はありません。

この瞬間に私のクエリはすべてのプロパティを返します。

答えて

-1

なぜ、すべてのtrueのproperty_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); 
     }); 
    } 
}); 

ですLaravelが最初のorWhereが実際にどこにあるべきかを知るには十分にスマートなのかどうかは分かりません。アメニティのループを開始する前に、->where(DB::raw(1), 1)を追加して、Laravelがwhere 1 = 1というクエリを作成してから、orの残りの部分を引き続き実行できるようにする必要があります。

関連する問題