Laravel whereIn 或 whereIn
Posted
技术标签:
【中文标题】Laravel whereIn 或 whereIn【英文标题】:Laravel whereIn OR 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
。伙计,你应该第一次尝试。
【参考方案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))
-
使用
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))
-
使用
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);
【讨论】:
@HassanAzimi 您的评论错误且具有误导性。 [链接] (laravel.com/api/5.4/Illuminate/Database/Query/…)【参考方案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;
看看它有第三个布尔参数。祝你好运。
【讨论】:
以上是关于Laravel whereIn 或 whereIn的主要内容,如果未能解决你的问题,请参考以下文章
使用 Laravel 查询构建器方法 whereIn() 和子查询
Laravel Query Builder 在“whereIn”语句的子查询中使用父查询?