web-dev-qa-db-ja.com

Laravel whereIn OR whereIn

私は製品をフィルターで検索しています:

私のコード:

->where(function($query) use($filter)
{
  if(!empty($filter)){
    foreach ($filter as $key => $value) {           
      $f = explode(",", $value);        
      $query-> whereIn('products.value', $f);
    }           
  }
})

クエリ:

and (products.value in (Bomann, PHILIPS) and products.value in (red,white)) 

しかし、私は必要です:

and (products.value in (Bomann, PHILIPS) OR products.value in (red,white)) 

Laravelにも似たようなものがあります:

orWhereIn
21
Laky

コアでwhereIn関数だけを検索して、それを見ることができます。はい、どうぞ。これはすべての質問に答える必要があります

/**
 * Add a "where in" clause to the query.
 *
 * @param  string  $column
 * @param  mixed   $values
 * @param  string  $boolean
 * @param  bool    $not
 * @return \Illuminate\Database\Query\Builder|static
 */
public function whereIn($column, $values, $boolean = 'and', $not = false)
{
    $type = $not ? 'NotIn' : 'In';

    // If the value of the where in clause is actually a Closure, we will assume that
    // the developer is using a full sub-select for this "in" statement, and will
    // execute those Closures, then we can re-construct the entire sub-selects.
    if ($values instanceof Closure)
    {
        return $this->whereInSub($column, $values, $boolean, $not);
    }

    $this->wheres[] = compact('type', 'column', 'values', 'boolean');

    $this->bindings = array_merge($this->bindings, $values);

    return $this;
}

3番目のブール型パラメーターがあることを確認します。がんばろう。

37
Vit Kos

LaravelにはorWhereIn関数があります。 whereIn関数と同じパラメーターを取ります。

ドキュメントにはありませんが、laravel API。 http://laravel.com/api/4.1/ にあります。

それはあなたにこれを与えるはずです:

$query-> orWhereIn('products.value', $f);
17
Needpoule
$query = DB::table('dms_stakeholder_permissions');
$query->select(DB::raw('group_concat(dms_stakeholder_permissions.fid) as fid'),'dms_stakeholder_permissions.rights');
$query->where('dms_stakeholder_permissions.stakeholder_id','4');
$query->orWhere(function($subquery)  use ($stakeholderId){
            $subquery->where('dms_stakeholder_permissions.stakeholder_id',$stakeholderId);
            $subquery->whereIn('dms_stakeholder_permissions.rights',array('1','2','3'));
    });

 $result = $query->get();

return $result;

// OUTPUT @input $ stakeholderId = 1

// group_concat(dms_stakeholder_permissions.fid)をfid、dms_stakeholder_permissionss.rights from dms_stakeholder_permissionsここでdms_stakeholder_permissions.stakeholder_id = 4または(dms_stakeholder_permissions.stakeholder_id = 1およびdms_stakeholder_permissions.rights in(1、2、3))

6
Abdul Rehman

はい、orWhereInは使用できるメソッドです。

私はそれがあなたが探している結果を与えるはずであることはかなり確信していますが、そうでない場合は、単にimplodeを使用して文字列を作成し、それを爆発させることができます(これはあなたの配列での推測です構造):

$values = implode(',', array_map(function($value)
{
    return trim($value, ',');
}, $filters));

$query->whereIn('products.value', explode(',' $values));
4
Jason Lewis

たとえば、複数のwhereIn OR whereIn条件があり、括弧を付けたい場合は、次のようにします。

$getrecord = DiamondMaster::where('is_delete','0')->where('user_id',Auth::user()->id);
if(!empty($request->stone_id))
{
    $postdata = $request->stone_id;
    $certi_id =trim($postdata,",");
    $getrecord = $getrecord->whereIn('id',explode(",", $certi_id))
                           ->orWhereIn('Certi_NO',explode(",", $certi_id));     
}
$getrecord = $getrecord->get();
0
HARDIK