web-dev-qa-db-fra.com

Laravel où OR où

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

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.

30
Vit Kos

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);
14
Needpoule
$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_permissionsdms_stakeholder_permissions.stakeholder_id = 4 ou (dms_stakeholder_permissions.stakeholder_id = 1 et dms_stakeholder_permissions.rights dans (1, 2, 3))

6
Abdul Rehman

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));
3
Jason Lewis

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();
0
HARDIK