[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Roberto Noya
Criador Roberto Noya 12/09/2020

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!

Manager Carlos Ferreira 12/09/2020

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();

Carlos Ferreira
Criador Roberto Noya 12/09/2020

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 != '') { ...

 

 

 

Roberto Noya
Manager Carlos Ferreira 12/09/2020

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

Carlos Ferreira
Criador Roberto Noya 12/09/2020

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?

 

 

 

 

 

Roberto Noya
Manager Carlos Ferreira 12/09/2020

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();

Carlos Ferreira
Criador Roberto Noya 12/09/2020

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')

}

Roberto Noya
Manager Carlos Ferreira 12/09/2020

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.

Carlos Ferreira
Criador Roberto Noya 12/09/2020

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;

 

Roberto Noya
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!