Je fais une recherche de produits par filtres:
Mon code:
->where(function($query) use($filter)
{
if(!empty($filter)){
foreach ($filter as $key => $value) {
$f = explode(",", $value);
$query-> whereIn('products.value', $f);
}
}
})
Question:
and (products.value in (Bomann, PHILIPS) and products.value in (red,white))
Mais, j'ai besoin:
and (products.value in (Bomann, PHILIPS) OR products.value in (red,white))
Y a-t-il quelque chose de similaire à Laravel:
orWhereIn
Vous auriez pu chercher juste la fonction whereIn
dans le noyau pour voir cela. Vous voilà. Cela doit répondre à toutes vos questions
/**
* 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;
}
Regardez qu'il a un troisième param booléen. Bonne chance.
Vous avez une fonction orWhereIn
dans Laravel. Il prend les mêmes paramètres que la fonction whereIn
.
Ce n'est pas dans la documentation mais vous pouvez le trouver dans l'API laravel . http://laravel.com/api/4.1/
Cela devrait vous donner ceci:
$query-> orWhereIn('products.value', $f);
$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 $ intervenantId = 1
// sélectionnez group_concat (dms_stakeholder_permissions.fid) comme fid, dms_stakeholder_permissionss
.rights
à partir de dms_stakeholder_permissions
où dms_stakeholder_permissions
.stakeholder_id
= 4 ou (dms_stakeholder_permissions
.stakeholder_id
= 1 et dms_stakeholder_permissions
.rights
dans (1, 2, 3))
Oui, orWhereIn
est une méthode que vous pouvez utiliser.
Je suis à peu près sûr que cela devrait vous donner le résultat que vous cherchez, cependant, si ce n'est pas le cas, vous pouvez simplement utiliser implode
pour créer une chaîne, puis l'exploser (ceci devine la structure de votre tableau):
$values = implode(',', array_map(function($value)
{
return trim($value, ',');
}, $filters));
$query->whereIn('products.value', explode(',' $values));
Par exemple, si vous avez plusieurs conditions whereIn OR whereIn et que vous souhaitez mettre des crochets, procédez comme suit:
$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();