2016-08-31 5 views
0

私は次のクエリを持っている:LaravelとOrWhere複数の条件

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

私の問題は、このクエリではなく、与えられたuser_Id.のすべてのユーザーのアイテムを返すことです。 orWhereがwhere'sのすべてに適用されるので、それはだが、私はそれがこれだけに適用する必要があります。

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

私だけ与えられます$ this-> IDユーザーのアイテムを返すようにクエリを解決することができますか?

+1

私は 'orInwhere'とは違って、' whereIn'演算子を ' - > whereIn( 'items.type'、[" stones "、" fish "])'のように使うことができると思います。 – camelCase

答えて

0

閉鎖、次のようなものを使用します

$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は、このようなようなAdvanced Where Clausesをサポートしています。

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

使用するのではなく、私は、別のオプション(クリーナー、IMOを読みやすくする)を推測しますorWhereは、whereIn operatorのように使用できます。

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