Laravel гдеIn OR гдеIn
Я делаю поиск продуктов по фильтрам:
Мой код:
->where(function($query) use($filter)
{
if(!empty($filter)){
foreach ($filter as $key => $value) {
$f = explode(",", $value);
$query-> whereIn('products.value', $f);
}
}
})
Query:
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
Ответы
Ответ 1
Вы могли бы искать только для функции 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;
}
Посмотрите, что у него есть третий булев параметр. Удачи.
Ответ 2
У вас есть функция orWhereIn
в Laravel. Он принимает те же параметры, что и функция whereIn
.
Это не в документации, но вы можете найти ее в API laravel.
http://laravel.com/api/4.1/
Это должно дать вам следующее:
$query-> orWhereIn('products.value', $f);
Ответ 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;
//OUTPUT @input $interestholderId = 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
в (1, 2, 3))
Ответ 4
Да, orWhereIn
- это метод, который вы можете использовать.
Я уверен, что он должен дать вам результат, который вы ищете, однако, если вы не можете просто использовать implode
для создания строки и затем взорвать ее (это предположение в вашем массиве структура):
$values = implode(',', array_map(function($value)
{
return trim($value, ',');
}, $filters));
$query->whereIn('products.value', explode(',' $values));
Ответ 5
Например, если у вас есть несколько условий whereIn ИЛИ 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();