【问题标题】:Laravel whereIn OR whereInLaravel whereIn 或 whereIn
【发布时间】:2014-05-10 15:06:25
【问题描述】:

我正在按过滤器搜索产品:

我的代码:

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

【问题讨论】:

  • 是的,它完全被称为orWhereIn。伙计,你应该第一次尝试。

标签: php mysql laravel laravel-4 query-builder


【解决方案1】:

是的,orWhereIn Laravel 中存在 where 子句方法。有关详细信息,请参阅 Laravel Query Builder 官方文档的以下链接。

文档链接:https://laravel.com/docs/8.x/queries#additional-where-clauses

有两种方法可以得到下面的输出。

and (products.value in (Bomann, PHILIPS) OR products.value in (red,white))
  1. 使用orWhereIn
$query = Product::where('color', 'blue')
    ->whereIn('value', ['Bomann', 'PHILIPS'])
    ->orWhereIn('value', ['red', 'white'])
    ->get();

输出:

select * from `products` where `color` = 'blue' and `value` in (Bomann, PHILIPS) OR `value` in (red,white)) 
  1. 使用orWhere 和whereIn
$query2 = Product::where('color', 'blue')
    ->whereIn('value', ['Bomann', 'PHILIPS'])
    ->orWhere(function ($query) {
        $query->whereIn('value', ['Bomann', 'PHILIPS']);
    })
    ->get();

输出:

select * from `products` where `color` = 'blue' and `value` in (Bomann, PHILIPS) OR (`value` in (red,white)) 

【讨论】:

    【解决方案2】:

    例如,如果您有多个 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();
    

    【讨论】:

      【解决方案3】:
      $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;
      

      // 输出@input $stakeholderId = 1

      //选择 group_concat(dms_stakeholder_permissions.fid) 作为 fid,dms_stakeholder_permissionss.rights from dms_stakeholder_permissions where dms_stakeholder_permissions.stakeholder_id = 4 或 (dms_stakeholder_permissions.stakeholder_id = 1 和 @987635 @.rights in (1, 2, 3))

      【讨论】:

        【解决方案4】:

        是的,orWhereIn 是您可以使用的方法。

        我很确定它应该会给你想要的结果,但是,如果没有,你可以简单地使用 implode 创建一个字符串然后分解它(这是对你的数组的猜测结构):

        $values = implode(',', array_map(function($value)
        {
            return trim($value, ',');
        }, $filters));
        
        $query->whereIn('products.value', explode(',' $values));
        

        【讨论】:

          【解决方案5】:

          你在 Laravel 中有一个 orWhereIn 函数。它采用与whereIn 函数相同的参数。

          它不在文档中,但您可以在 laravel API 中找到它。 http://laravel.com/api/4.1/

          这应该给你这个:

          $query-> orWhereIn('products.value', $f);
          

          【讨论】:

          【解决方案6】:

          您可以只搜索核心中的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;
          }
          

          看看它有第三个布尔参数。祝你好运。

          【讨论】:

            猜你喜欢
            • 2017-01-12
            • 2018-09-27
            • 2017-05-30
            • 2019-11-06
            • 2021-03-23
            • 2017-04-01
            • 2015-07-06
            • 2020-12-08
            • 1970-01-01
            相关资源
            最近更新 更多