2016-10-12 15 views
0

Ich habe eine belongstoMany Beziehung auf meinem Property Modell.Laravel WhereHas Abfrage liefert keine relevanten Ergebnisse

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

Dann auf meinem post Methode habe ich diese params:

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

Wo ist der Schlüssel der Infrastruktur-ID und der Wert wahr oder falsch ist (boolean).

Auf der Grundlage dieser Informationen, die ich die relevanten Ergebnisse abfragen versuchen, damit ich diese Anfrage:

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

So in natürlicher Sprache Ich möchte alle Eigenschaften, die Metalltür (amenity_id 1 mit Status 1) und hat nicht Hone (Amenity_id 2 mit Status 0) und so ....

In diesem Moment gibt meine Abfrage alle Eigenschaften zurück.

Antwort

-1

Warum nicht einfach properties_amenities einfügen, wo alles wahr ist.

+1

Dies wird nicht die Eigenschaften basierend auf '$ Annehmlichkeiten' params zurückgeben. –

0

Die Art und Weise Sie Ihre Abfrage erstellt haben, sieht es wie folgt aus ...

... 
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 
... 

Wie Sie sehen, ist dies nicht viel Sinn macht. Was ich glaube, Sie wollen es zu tun, etwas mehr wie die folgenden ...

... 
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) 
... 

Und um dies mit dem Query Builder zu erreichen ...

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

ich nicht getestet haben also bin ich mir nicht sicher, ob Laravel schlau genug ist zu wissen, dass der erste orWhere eigentlich ein wo sein sollte. Bevor Sie mit dem Durchschleifen der Annehmlichkeiten beginnen, müssen Sie unter Umständen eine ->where(DB::raw(1), 1) hinzufügen, damit Laravel beginnt, die Abfrage mit where 1 = 1 zu erstellen, und dann den Rest der or s weiterhin ausführen kann.

Verwandte Themen