598 Stimmen

Wie erstellt man eine Abfrage mit mehreren WHERE-Klauseln unter Verwendung von Laravel Eloquent?

Ich verwende den Laravel Eloquent Query Builder und habe eine Abfrage, bei der ich eine WHERE-Klausel mit mehreren Bedingungen haben möchte. Es funktioniert, aber es ist nicht elegant.

Beispiel:

$results = User::where('this', '=', 1)
    ->where('that', '=', 1)
    ->where('this_too', '=', 1)
    ->where('that_too', '=', 1)
    ->where('this_as_well', '=', 1)
    ->where('that_as_well', '=', 1)
    ->where('this_one_too', '=', 1)
    ->where('that_one_too', '=', 1)
    ->where('this_one_as_well', '=', 1)
    ->where('that_one_as_well', '=', 1)
    ->get();

Gibt es einen besseren Weg, dies zu tun, oder sollte ich bei dieser Methode bleiben?

915voto

Jarek Tkaczyk Punkte 76017

In Laravel 5.3 (und immer noch gültig für 7.x) können Sie genauere "where"-Bedingungen als Array übergeben:

$query->where([
    ['column_1', '=', 'value_1'],
    ['column_2', '<>', 'value_2'],
    [SPALTE, OPERATOR, WERT],
    ...
])

Persönlich habe ich noch keinen Anwendungsfall für dies gegenüber mehreren where-Aufrufen gefunden, aber Fakt ist, dass Sie es verwenden können.

Seit Juni 2014 können Sie ein Array an where übergeben

Solange Sie alle wheres mit dem and-Operator verwenden möchten, können Sie sie auf diese Weise gruppieren:

$matchThese = ['field' => 'value', 'another_field' => 'another_value', ...];

// Wenn Sie eine andere Gruppe von wheres als Alternative benötigen:
$orThose = ['yet_another_field' => 'yet_another_value', ...];

Dann:

$results = User::where($matchThese)->get();

// mit einer weiteren Gruppe
$results = User::where($matchThese)
    ->orWhere($orThose)
    ->get();

Das obige Ergebnis führt zu einer solchen Abfrage:

SELECT * FROM users
  WHERE (field = value AND another_field = another_value AND ...)
  OR (yet_another_field = yet_another_value AND ...)

143voto

Juljan Punkte 2116

Sie können Unterabfragen in einer anonymen Funktion wie folgt verwenden:

 $results = User::where('this', '=', 1)
       ->where('that', '=', 1)
       ->where(
           function($query) {
             return $query
                    ->where('this_too', 'LIKE', '%fake%')
                    ->orWhere('that_too', '=', 1);
            })
            ->get();

123voto

Luis Dalmolin Punkte 3116

Abfragebereiche können Ihnen helfen, Ihren Code lesbarer zu machen.

http://laravel.com/docs/eloquent#query-scopes

Die Antwort wird mit einem Beispiel aktualisiert:

Erstellen Sie in Ihrem Modell Bereichsmethoden wie diese:

public function scopeActive($query)
{
    return $query->where('active', '=', 1);
}

public function scopeThat($query)
{
    return $query->where('that', '=', 1);
}

Dann können Sie diese Bereiche aufrufen, während Sie Ihre Abfrage erstellen:

$users = User::active()->that()->get();

85voto

Bedingungen mit Array verwenden:

$users = User::where([
       'column1' => value1,
       'column2' => value2,
       'column3' => value3
])->get();

Wird eine Abfrage wie unten erstellen:

SELECT * FROM TABELLE WHERE column1 = Wert1 und column2 = Wert2 und column3 = Wert3

Bedingungen mit anonymer Funktion:

$users = User::where('column1', '=', value1)
               ->where(function($query) use ($variable1,$variable2){
                    $query->where('column2','=',$variable1)
                   ->orWhere('column3','=',$variable2);
               })
              ->where(function($query2) use ($variable1,$variable2){
                    $query2->where('column4','=',$variable1)
                   ->where('column5','=',$variable2);
              })->get();

Wird eine Abfrage wie unten erstellen:

SELECT * FROM TABELLE WHERE column1 = Wert1 und (column2 = Wert2 oder column3 = Wert3) und (column4 = Wert4 und column5 = Wert5)

57voto

alexglue Punkte 1282

In diesem Fall könnten Sie etwas Ähnliches verwenden wie:

User::where('this', '=', 1)
    ->whereNotNull('created_at')
    ->whereNotNull('updated_at')
    ->where(function($query){
        return $query
        ->whereNull('alias')
        ->orWhere('alias', '=', 'admin');
    });

Es sollte Ihnen eine Abfrage wie folgt liefern:

SELECT * FROM `user` 
WHERE `user`.`this` = 1 
    AND `user`.`created_at` IS NOT NULL 
    AND `user`.`updated_at` IS NOT NULL 
    AND (`alias` IS NULL OR `alias` = 'admin')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X