2016-08-31 8 views
0

Ich habe die folgende Abfrage:Laravel Wo und orWhere mehrere Bedingungen

$items = UserItems::join('items','items.id','=','user_items.item_id') 
      ->where('user_id','=',$this->id) 
      ->where('quantity','>',0) 
      ->where('items.type',"stones") 
      ->orWhere('items.type',"fish") 
      ->get(); 

Mein Problem ist, dass diese Abfrage die Elemente aller Benutzer statt der angegebenen user_Id. zurückgibt. Es ist, weil die orWhere auf alle der where's gilt aber ich brauche es nur auf diese anzuwenden:

->where('items.type',"stones") 
       ->orWhere('items.type',"fish") 

Wie ich die Abfrage beheben können nur die angegebenen $ this-> id Benutzer Artikel zurückgeben?

+1

Ich denke, eine andere Option, im Gegensatz zu "orWhere", könnte sein, den 'whereIn'-Operator wie folgt zu verwenden:' -> whereIn ('items.type', ["stones", "fish"]) '. – camelCase

Antwort

0

Verwenden Sie einen Verschluss, so etwas wie die folgenden:

$userId = $this->id; 
$items = UserItems::join('items','items.id','=','user_items.item_id') 
->where('user_id','=', $userId) 
->where('quantity','>',0) 
->where(function($query) { 
    $query 
    ->where('items.type',"stones") 
    ->orWhere('items.type',"fish"); 
}) 
->get(); 
1

Laravel unterstützt Advanced Where Clauses wie solche:

$items = UserItems::join('items','items.id','=','user_items.item_id') 
    ->where('user_id','=',$this->id) 
    ->where('quantity','>',0) 
    ->where(function($query) { 
     $query->where('items.type',"stones") 
      ->orWhere('items.type',"fish"); 
    }) 
    ->get(); 

Ich denke, eine andere Option (leichter, sauberer IMO zu lesen), im Gegensatz zur Verwendung orWhere, könnte sein, die whereIn operator zu verwenden wie:

$items = UserItems::join('items','items.id','=','user_items.item_id') 
    ->where('user_id','=',$this->id) 
    ->where('quantity','>',0) 
    ->whereIn('items.type', ["stones", "fish"]) 
    ->get(); 
Verwandte Themen