Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia, trabalho com laravel a um tempo, mas me surgiu uma dúvida agora em um select.
$search = DB::table('contratos as a')
->leftjoin('variaveis as b','a.carteira_id','=','b.id')
->leftjoin('cidades as c','a.comarca_id','=','c.id')
->leftjoin('status as d','a.status_id','=','d.id')
->join('users as e','a.responsavel_id','=','e.id')
->leftjoin('cliente as f','a.cliente_id','=','f.id')
->select('a.*', 'b.name as varname', 'd.name as statusname', 'c.name as ciddname', 'c.uf as cidduf','e.name as username','f.name as cliente_name')
->whereIn('a.status_id', Request::get('status_id'))
->whereIn('a.status_pos_mandado', Request::get('status_pos_mandado'))
->whereIn('a.status_contencioso', Request::get('status_contencioso'))
->where('a.sub_status_pos', Request::get('sub_status_pos')) // -> 1
->where('a.sub_status_cont', Request::get('sub_status_cont')) // -> 2
->paginate(20);
No select acima, nas condições where que eu marquei com 1 e 2, são 2 campos não obrigatório no banco de dados e não são obrigatórios na busca. Quando vou filtrar os casos, se eu não selecionar nenhum dos 2 where, eu quero que ele não aplique o filtro e siga com os filtros selecionados. O que ocorre hoje é que mesmo eu não selecionando ele na busca, quando é feita a filtragem no BD, ele é executado como um valor em branco, assim procurando só os valores em branco. O que eu quero é que quando não for selecionado um valor, ele não aplique filtro..
Desde já agradeço.Conhece algum exemplo claro utilizando um Callback em uma estrutura de seleção?
Não tem receita de Bolo, você quem tem que saber a hora que deva utilizar funções de callbacks.
Exemplo usando seu select:
->select("...", function($query) use ($request) {
$query->whereIn('a.status_id', $request->get('status_id'))
...
})->paginate(20);
Segue o tutorial, está bem detalhado, dispensa eu ter escrever redundância.
[http://desenvolvimentoparaweb.com/php/funcoes-anonimas-closures-php/](http://desenvolvimentoparaweb.com/php/funcoes-anonimas-closures-php/)
manual
https://secure.php.net/manual/pt_BR/language.types.callable.php
Beleza, Valeu
Esqueci do Mais importante, que é lambda e closure, oque o laravel usa no núcleo.
http://www.diogomatheus.com.br/blog/php/funcoes-anonimas-lambda-e-closure-no-php/
Mas uma ideia simples é usar on para diminuir essa lambança de codigo join, where select etc.
$search = DB::table('contratos')
->join('variaveis', function ($join) use ($request) {
$join->on('contratos.carteira_id', '=', 'variaveis.id')
->whereIn('contratos.status_id', $request->get('status_id'));
})
->paginate(20);
Fiz só a primeiro join, só estudar o modelo e replicar.
Lembrando que a variável request em use (), você vai ter que atribuir antes o Objeto Request a ela.
Se for usar ifs, é entre as {}
Use Callbacks para efetuar um ou mais ifs de verificação.
https://pt.wikipedia.org/wiki/Callback