Laravel Avançado Onde passa a variável para a função?

86

Exemplo em doc:

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

Mas e se eu precisar usar uma variável externa assim:

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

                })

Por enquanto eu criei uma nova propriedade e acessei através $this->, mas existe alguma maneira mais conveniente?

frenesi
fonte

Respostas:

225

Você pode passar as variáveis ​​necessárias do escopo pai para o fechamento com a usepalavra - chave.

Por exemplo:

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

Mais sobre isso aqui .

EDITAR (atualização de 2019):

PHP 7.4 (será lançado em 28 de novembro de 2019 ) apresenta uma variação mais curta das funções anônimas chamadas funções de seta, o que torna isso um pouco menos prolixo.

Um exemplo usando PHP 7.4 que é funcionalmente quase equivalente (veja o terceiro ponto abaixo):

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

Diferenças em comparação com a sintaxe regular:

  • fnpalavra-chave em vez de function.
  • Não há necessidade de listar explicitamente todas as variáveis ​​que devem ser capturadas do escopo pai - isso agora é feito automaticamente por valor. Veja a falta de usepalavra-chave no último exemplo.
  • As funções de seta sempre retornam um valor. Isso também significa que é impossível usar o voidtipo de retorno ao declará-los.
  • A returnpalavra-chave deve ser omitida.
  • As funções de seta devem ter uma única expressão que é a instrução de retorno. Funções multilinhas não são suportadas no momento. Você ainda pode encadear métodos.
Kajetons
fonte
15

A resposta de @kajetons é totalmente funcional.

Você também pode passar várias variáveis, como: use($var1, $var2)

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

Se você estiver usando o Laravel eloquent, você também pode tentar isso.

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

Você pode passar variáveis ​​usando este ...

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