Laravel Advanced Wo kann man eine Variable in eine Funktion übergeben?

85

Beispiel in doc:

DB::table('users')
        ->whereExists(function($query)
        {
            $query->select(DB::raw(1))
                  ->from('orders')
                  ->whereRaw('orders.user_id = users.id');
        })
        ->get();

Aber was ist, wenn ich eine solche externe Variable verwenden muss:

            ->where('city_id', '=', $this->city->id)
            ->where(function($query)
                {
                    $query->where('name', 'LIKE', '%'.$searchQuery.'%')
                    ->orWhere('address', 'LIKE', '%'.$searchQuery.'%')

                })

Im Moment habe ich eine neue Immobilie erstellt und über sie zugegriffen $this->, aber gibt es einen bequemeren Weg?

Raserei
quelle

Antworten:

223

Sie können die erforderlichen Variablen aus dem übergeordneten Bereich mit dem useSchlüsselwort an den Abschluss übergeben.

Zum Beispiel:

DB::table('users')->where(function ($query) use ($activated) {
    $query->where('activated', '=', $activated);
})->get();

Mehr dazu hier .

EDIT (Update 2019):

PHP 7.4 (wird am 28. November 2019 veröffentlicht ) führt eine kürzere Variante der anonymen Funktionen ein, die als Pfeilfunktionen bezeichnet werden , wodurch dies etwas weniger ausführlich ist.

Ein Beispiel mit PHP 7.4, das funktional nahezu gleichwertig ist (siehe den dritten Punkt unten):

DB::table('users')->where(fn($query) => $query->where('activated', '=', $activated))->get();

Unterschiede zur regulären Syntax:

  • fnSchlüsselwort anstelle von function.
  • Es ist nicht erforderlich, alle Variablen, die aus dem übergeordneten Bereich erfasst werden sollen, explizit aufzulisten. Dies erfolgt jetzt automatisch nach Wert. Siehe das Fehlen eines useSchlüsselworts im letzteren Beispiel.
  • Pfeilfunktionen geben immer einen Wert zurück. Dies bedeutet auch, dass es nicht möglich ist, den voidRückgabetyp zu verwenden, wenn sie deklariert werden.
  • Das returnSchlüsselwort muss weggelassen werden.
  • Pfeilfunktionen müssen einen einzelnen Ausdruck haben, der die return-Anweisung ist. Mehrzeilige Funktionen werden derzeit nicht unterstützt. Sie können jedoch weiterhin Methoden verketten.
Kajetons
quelle
15

Die Antwort von @kajetons ist voll funktionsfähig.

Sie können auch mehrere Variablen übergeben, indem Sie sie wie folgt übergeben: use($var1, $var2)

DB::table('users')->where(function ($query) use ($activated,$var2) {
    $query->where('activated', '=', $activated);
    $query->where('var2', '>', $var2);
})->get();
Nagibaba
quelle
5

Wenn Sie Laravel eloquent verwenden, können Sie dies auch versuchen.

$result = self::select('*')
                    ->with('user')
                    ->where('subscriptionPlan', function($query) use($activated){
                        $query->where('activated', '=', $roleId);
                    })
                    ->get();
Nikunj K.
quelle
2

Sie können Variablen damit übergeben ...

$status =1;
 $info = JOBS::where(function($query) use ($status){        
         $query->where('status',$status);
         })->get();
print_r($info);
Ajay Singh
quelle