web-dev-qa-db-de.com

Wie erstelle ich eine Multiple Where-Klausel-Abfrage mit Laravel Eloquent?

Ich verwende den Laravel Builder für beredte Abfragen und habe eine Abfrage, bei der ich eine WHERE -Klausel für mehrere 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 mich an diese Methode halten?

320
veksen

In Laravel 5. können Sie granularere Werte verwenden, die als Array übergeben wurden:

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

Persönlich habe ich keinen Anwendungsfall für diese Funktion über nur mehrere where Aufrufe gefunden, aber Tatsache ist, dass Sie ihn verwenden können.

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

Solange Sie den wheres -Operator and verwenden möchten, können Sie sie folgendermaßen gruppieren:

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

// if you need another group of wheres as an alternative:
$orThose = ['yet_another_field' => 'yet_another_value', ...];

Dann:

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

// with another group
$results = User::where($matchThese)
    ->orWhere($orThose)
    ->get();

Das Obige 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 ...)
488
Jarek Tkaczyk

Abfragebereiche können Ihnen dabei helfen, den Code besser lesbar zu machen.

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

Aktualisieren Sie diese Antwort mit einem Beispiel:

Erstellen Sie in Ihrem Modell folgende Bereichsmethoden:

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

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

Anschließend können Sie diese Bereiche beim Erstellen Ihrer Abfrage aufrufen:

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

Sie können Unterabfragen in anonymen Funktionen wie folgt verwenden:

 $results = User::where('this', '=', 1)
            ->where('that', '=', 1)
            ->where(function($query) {
                /** @var $query Illuminate\Database\Query\Builder  */
                return $query->where('this_too', 'LIKE', '%fake%')
                    ->orWhere('that_too', '=', 1);
            })
            ->get();
62
Juljan

In diesem Fall könnten Sie so etwas verwenden:

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 liefern wie:

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')
31
alexglue

Bedingungen mit Array:

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

Erzeugt eine Abfrage wie folgt:

SELECT * FROM TABLE WHERE column1=value1 and column2=value2 and column3=value3

Bedingungen unter Verwendung der anonymen 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();

Erzeugt eine Abfrage wie folgt:

SELECT * FROM TABLE WHERE column1=value1 and (column2=value2 or column3=value3) and (column4=value4 and column5=value5)
21
srmilon

Multiple where-Klauseln

    $query=DB::table('users')
        ->whereRaw("users.id BETWEEN 1003 AND 1004")
        ->whereNotIn('users.id', [1005,1006,1007])
        ->whereIn('users.id',  [1008,1009,1010]);
    $query->where(function($query2) use ($value)
    {
        $query2->where('user_type', 2)
            ->orWhere('value', $value);
    });

   if ($user == 'admin'){
        $query->where('users.user_name', $user);
    }

Endlich das Ergebnis

    $result = $query->get();
9
Majbah Habib

Der whereColumn -Methode kann ein Array mit mehreren Bedingungen übergeben werden. Diese Bedingungen werden mit dem Operator and verknüpft.

Beispiel:

$users = DB::table('users')
            ->whereColumn([
                ['first_name', '=', 'last_name'],
                ['updated_at', '>', 'created_at']
            ])->get();

$users = User::whereColumn([
                ['first_name', '=', 'last_name'],
                ['updated_at', '>', 'created_at']
            ])->get();

Weitere Informationen finden Sie in diesem Abschnitt der Dokumentation https://laravel.com/docs/5.4/queries#where-clauses

8
Alex Quintero
Model::where('column_1','=','value_1')->where('column_2 ','=','value_2')->get();

OR

// If you are looking for equal value then no need to add =
Model::where('column_1','value_1')->where('column_2','value_2')->get();

OR

Model::where(['column_1' => 'value_1','column_2' => 'value_2'])->get();
7
DsRaj
$projects = DB::table('projects')->where([['title','like','%'.$input.'%'],
    ['status','<>','Pending'],
    ['status','<>','Not Available']])
->orwhere([['owner', 'like', '%'.$input.'%'],
    ['status','<>','Pending'],
    ['status','<>','Not Available']])->get();
5
Lim Kean Phang

Stellen Sie sicher, dass Sie andere Filter auf Unterabfragen anwenden, da andernfalls die oder möglicherweise alle Datensätze erfassen.

$query = Activity::whereNotNull('id');
$count = 0;
foreach ($this->Reporter()->get() as $service) {
        $condition = ($count == 0) ? "where" : "orWhere";
        $query->$condition(function ($query) use ($service) {
            $query->where('branch_id', '=', $service->branch_id)
                  ->where('activity_type_id', '=', $service->activity_type_id)
                  ->whereBetween('activity_date_time', [$this->start_date, $this->end_date]);
        });
    $count++;
}
return $query->get();
5
adamk

Sie können Eloquenz in Laravel 5. verwenden

Alle Ergebnisse

UserModel::where('id_user', $id_user)
                ->where('estado', 1)
                ->get();

Teilergebnisse

UserModel::where('id_user', $id_user)
                    ->where('estado', 1)
                    ->pluck('id_rol');
3

verwenden Sie die Bedingung whereIn und übergeben Sie das Array

$array = [1008,1009,1010];

User::whereIn('users.id', $array)->get();

2
Rahul Tathod

Ohne ein echtes Beispiel ist es schwierig, eine Empfehlung abzugeben. Ich musste jedoch nie so viele WHERE-Klauseln in einer Abfrage verwenden, und dies weist möglicherweise auf ein Problem mit der Struktur Ihrer Daten hin.

Es kann hilfreich sein, Informationen zur Datennormalisierung zu erhalten: http://en.wikipedia.org/wiki/Third_normal_form

2
Aaron Cicali

Sie können das Array in der where-Klausel wie unten gezeigt verwenden.

$result=DB::table('users')->where(array(
'column1' => value1,
'column2' => value2,
'column3' => value3))
->get();
1
DB::table('users')
            ->where('name', '=', 'John')
            ->orWhere(function ($query) {
                $query->where('votes', '>', 100)
                      ->where('title', '<>', 'Admin');
            })
            ->get();
1
pardeep

Gemäß meinem Vorschlag, wenn Sie filtern oder suchen

dann solltest du gehen mit:

        $results = User::query();
        $results->when($request->that, function ($q) use ($request) {
            $q->where('that', $request->that);
        });
        $results->when($request->this, function ($q) use ($request) {
            $q->where('this', $request->that);
        });
        $results->when($request->this_too, function ($q) use ($request) {
            $q->where('this_too', $request->that);
        });
        $results->get();
0
Dhruv Raval

Implementieren Sie es wie folgt, indem Sie pure Eloquent verwenden. Dieser Code gibt alle angemeldeten Benutzer zurück, deren Konten aktiv sind. $users = \App\User::where('status', 'active')->where('logged_in', true)->get();

0
Craig GeRa

Benutze das

$users = DB::table('users')
                    ->where('votes', '>', 100)
                    ->orWhere('name', 'John')
                    ->get();
0