web-dev-qa-db-de.com

Laravel wo OR worin

Ich mache eine Produktsuche nach Filtern:

Mein Code:

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

Abfrage:

and (products.value in (Bomann, PHILIPS) and products.value in (red,white)) 

Aber ich brauche:

and (products.value in (Bomann, PHILIPS) OR products.value in (red,white)) 

Gibt es etwas Ähnliches in Laravel:

orWhereIn
16
Laky

Sie hätten einfach nach whereIn function im Kern gesucht, um das zu sehen. Hier sind Sie ja. Dies muss alle Ihre Fragen beantworten

/**
 * 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;
}

Schauen Sie, dass es einen dritten booleschen Parameter hat. Viel Glück.

30
Vit Kos

Sie haben in Laravel eine orWhereIn-Funktion. Es benötigt die gleichen Parameter wie die Funktion whereIn.

Es ist nicht in der Dokumentation enthalten, aber Sie können es in der Laravel-API finden . http://laravel.com/api/4.1/

Das sollte dir das geben:

$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 $ stakeholderId = 1

// Wählen Sie group_concat (dms_stakeholder_permissions.fid) als fid, dms_stakeholder_permissionss.rights aus dms_stakeholder_permissions aus, wobei dms_stakeholder_permissions.stakeholder_id = 4 oder (dms_stakeholder_permissions.stakeholder_id = 1 und dms_stakeholder_permissions.rights in (1, 2, 3))

6
Abdul Rehman

Ja, orWhereIn ist eine Methode, die Sie verwenden können.

Ich bin mir ziemlich sicher, dass Sie damit das gewünschte Ergebnis erhalten sollten. Wenn dies nicht der Fall ist, können Sie einfach mit implode eine Zeichenfolge erstellen und diese dann auflösen (dies ist eine Vermutung für Ihre Array-Struktur):

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

$query->whereIn('products.value', explode(',' $values));
3
Jason Lewis

Wenn Sie beispielsweise mehrere whereIn OR whereIn-Bedingungen haben und Klammern setzen möchten, führen Sie dies folgendermaßen aus:

$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