Query bulider Laravel
[Concluído]
Olá Equipe Especializa TI,
Tenho a seguinte dúvida quanto a construção de uma query existente em minha model.
Como faço para acrescentar uma JOIN somente se existir um determinado parametro no request.
No caso da criação de filtros conforme o request eu aprendi da seguinte maneira:
// Se existir o parâmetro rent_id eu adiciono na query.
$query = $this->where(function($query) use ($request) {
if ($request->rent_id != '') {
$query->where('fees.rent_id', $request->rent_id);
}
O que eu gostaria de fazer é caso exista um parâmetro por exemplo $request->alert eu gostaria de acrescentar uma join, porém não consegui. Por exemplo:
If(isset($request->alert) && $request->alert != ‘’){
$query ->join('alerts', 'alerts.rent_id', '=', 'rents.id')
}
Existe alguma forma de fazer isso?
Grato!
Olá, Roberto!
Tudo bem?
Uma das alternativas para resolver o seu caso é usar relacionamentos de tabelas.
No caso ao invés de usar join, use o with.
Exemplo:
$relatiships = [];
if ($request->alert) {
$relatiships = ['alerts'];
}
$dados = $this->repository
->with($relatiships)
->get();
No caso essa alterantiva do with (que inclusive eu ja uso em outras situações) não se aplica nesse caso pois a query não deve trazer nenhum registro quando não encontrado o devido registro na tabela JOIN.
Eu tenho uma solução mas não me parece a melhor onde simplesmente eu separo as querys. Exemplo:
if(isset($request->alerts_tipo) && $request->alerts_tipo != ''){
$query = $this->select("rents.*")
->join('alerts', 'alerts.rent_id', '=', 'rents.id')...
}else{
$query = $this->where(function($query) use ($request) {
$query->where('status','<>', 'Lixeira');
if($request->status != '') { ...
Olá, Roberto!
Não vi nada de especial nesse join que não dê para usar o with. Inclusive no with é possível aplicar querys, filtros e etc.
Isso daqui que precisa amigo: https://laravel.com/docs/8.x/eloquent-relationships#constraining-eager-loads
Olá Carlos,
Continuo com o problema. Acho que não estou conseguindo aplicar direito o que voce informou sobre o with.
Veja uma situação bem simples :
SELECT rents.id FROM rents JOIN alerts ON alerts.rent_id = rents.id WHERE alerts.data_alerta <= CURDATE() (total registros 1)
SELECT rents.id FROM rents JOIN alerts ON alerts.rent_id = rents.id (total registros 2)
Quando uso o With continua aparecendo 2 registros porém um deles contém as informações da tabela "alerts" e o outro aparece em branco.
A idéia é trazer apenas um único registro que contenha dados na tabela alerts.
O que determina aplicação do Join é uma parametro $request->alerts_tipo
Como voce faria?
Pode fazer o if e aplicar a condição que deseja, algo assim:
NomeModel::with(['relacionamento01', 'alerts' => function ($query) use ($request) {
$query->where('alert', '!=', '');
}])->get();
Olá Carlos,
Segue um json resumido para você entender:
{
"id": 2,
"tenant_id": 1,
"uuid": "9fcdf5d7-9a85-4318-820a-a5e9d62d394f",
"status": "Pendente",
"codigo": 2,
"created_at": "2020-06-03T16:36:12.000000Z",
"updated_at": "2020-09-16T23:07:11.000000Z",
"open_alerts": []
}
A ideia é: Quando “open_alerts” é null conforme acima o registro id: 2 não pode aparecer.
Eu consigo isso usando JOIN ( Rents::join('alerts', 'alerts.rent_id', '=', 'rents.id')->get() ) porém não sei se existe como aplicar o JOIN somente se o elemento $request->alert existe.
Gostaria de algo como:
If($request->alert == 1){
->join('alerts', 'alerts.rent_id', '=', 'rents.id')
}
A forma que te mostrei vai te atender.
Mas, vou passar outra linha de raciocínio pra você aplicar, um exemplo:
$query = new Post;
if (true) {
//$query = $query->where('title', 'teste');
}
dd($query->get());
Neste caso apliquei um where, mas você pode usar o join que precisa aplicar condicionalmente.
Olá Carlos,
Eu adaptei sua sugestão em minha model e deu certo!
Com essa dica vou conseguir excluir query's isoladas em uma só.
Muito Obrigado!
$query = $this->select('rents.codigo');
if($request->alert == 1) {
$query->join('alerts', 'alerts.rent_id', '=', 'rents.id');
}
if($request->status != '') {
$query->where('rents.status',$request->status);
}
$rents = $query->get();
return $rents;
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!