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
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.
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);
$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))
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));
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();