Laravel Advanced ¿Dónde se pasa la variable a la función?

86

Ejemplo en doc:

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

Pero, ¿qué pasa si necesito usar una variable externa como esa?

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

                })

Por ahora, creé una nueva propiedad y accedí a ella $this->, pero ¿hay alguna forma más conveniente?

frenesí
fuente

Respuestas:

225

Puede pasar las variables necesarias del ámbito principal al cierre con la usepalabra clave.

Por ejemplo:

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

Más sobre eso aquí .

EDITAR (actualización de 2019):

PHP 7.4 (se lanzará el 28 de noviembre de 2019 ) introduce una variación más corta de las funciones anónimas llamadas funciones de flecha, lo que hace que esto sea un poco menos detallado.

Un ejemplo usando PHP 7.4 que es funcionalmente casi equivalente (vea el tercer punto a continuación):

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

Diferencias en comparación con la sintaxis regular:

  • fnpalabra clave en lugar de function.
  • No es necesario enumerar explícitamente todas las variables que deben capturarse del ámbito principal; esto ahora se hace automáticamente por valor. Vea la falta de usepalabra clave en el último ejemplo.
  • Las funciones de flecha siempre devuelven un valor. Esto también significa que es imposible usar el voidtipo de retorno al declararlos.
  • La returnpalabra clave debe omitirse.
  • Las funciones de flecha deben tener una sola expresión que es la declaración de retorno. Las funciones de varias líneas no se admiten en este momento. Sin embargo, todavía puedes encadenar métodos.
kajetons
fuente
15

La respuesta de @kajetons es completamente funcional.

También puede pasar múltiples variables pasándolas como: use($var1, $var2)

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

Si está utilizando Laravel elocuente, también puede probar esto.

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

Puede pasar variables usando esto ...

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