Laravel其中在OR whereIn

Lak*_*aky 23 php mysql query-builder laravel laravel-4

我正在通过过滤器进行产品搜索:

我的代码:

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

查询:

and (products.value in (Bomann, PHILIPS) and products.value in (red,white)) 
Run Code Online (Sandbox Code Playgroud)

但是我需要:

and (products.value in (Bomann, PHILIPS) OR products.value in (red,white)) 
Run Code Online (Sandbox Code Playgroud)

Laravel有类似的东西:

orWhereIn
Run Code Online (Sandbox Code Playgroud)

Vit*_*Kos 40

你可能只是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;
}
Run Code Online (Sandbox Code Playgroud)

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


Nee*_*ule 18

orWhereIn在Laravel 有一个功能.它采用与whereIn函数相同的参数.

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

这应该给你这个:

$query-> orWhereIn('products.value', $f);
Run Code Online (Sandbox Code Playgroud)


Jas*_*wis 6

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

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

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

$query->whereIn('products.value', explode(',' $values));
Run Code Online (Sandbox Code Playgroud)


小智 6

$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;
Run Code Online (Sandbox Code Playgroud)

// OUTPUT @input $ stakeholderId = 1

//选择group_concat(dms_stakeholder_permissions.fid)为fid , dms_stakeholder_permissionss. rightsdms_stakeholder_permissions哪里dms_stakeholder_permissions.stakeholder_id= 4或(dms_stakeholder_permissions.stakeholder_id= 1, dms_stakeholder_permissions.rights在(1,2,3))


小智 6

是的,orWhereInLaravel 中存在 where 子句方法。请参阅以下官方 Laravel 查询生成器文档链接以获取详细信息。

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

有两种方法可以获得以下输出。

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

输出:

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

输出:

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

Run Code Online (Sandbox Code Playgroud)