Laravel Advanced Dov'è come passare la variabile in funzione?


87

Esempio in doc:

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

Ma cosa succede se ho bisogno di usare una variabile esterna in questo modo:

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

                })

Per ora ho creato una nuova proprietà e vi ho acceduto tramite $this->, ma esiste un modo più conveniente?

Risposte:


231

È possibile passare le variabili necessarie dall'ambito padre alla chiusura con la useparola chiave.

Per esempio:

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

Maggiori informazioni qui .

EDIT (aggiornamento 2019):

PHP 7.4 (sarà rilasciato il 28 novembre 2019 ) introduce una variazione più breve delle funzioni anonime chiamate funzioni freccia che la rendono un po 'meno prolissa.

Un esempio che utilizza PHP 7.4 che è funzionalmente quasi equivalente (vedere il terzo punto elenco di seguito):

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

Differenze rispetto alla sintassi normale:

  • fnparola chiave invece di function.
  • Non c'è bisogno di elencare esplicitamente tutte le variabili che dovrebbero essere catturate dall'ambito genitore - questo viene ora fatto automaticamente per valore. Vedi la mancanza diuse parole chiave nell'ultimo esempio.
  • Le funzioni freccia restituiscono sempre un valore. Ciò significa anche che è impossibile utilizzare il voidtipo di ritorno quando li si dichiara.
  • La returnparola chiave deve essere omessa.
  • Le funzioni freccia devono avere una singola espressione che è l'istruzione return. Le funzioni multilinea al momento non sono supportate. Tuttavia, puoi ancora concatenare metodi.

15

La risposta di @kajetons è perfettamente funzionante.

Puoi anche passare più variabili passandole come: use($var1, $var2)

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

5

Se stai usando Laravel eloquent puoi provare anche questo.

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

2

Puoi passare le variabili usando questo ...

$status =1;
 $info = JOBS::where(function($query) use ($status){        
         $query->where('status',$status);
         })->get();
print_r($info);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.