[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
pedro castr
Criador pedro castr 05/11/2019

Professor, tenho um modelo Client e um modelo Condition onde:

Client->hasMany(Condition)

Condition->belongsTo(Client)

Meu modelo Condition tem um campo 'date' e preciso listar todos os clientes recuperando apenas a útilma (data mais recente) condição associada à esse cliente. Existe uma forma simples de fazer com Eloquent ou pra consultas mais especificas é melhor usar o QueryBuilder? Como ficaria o código?

Obrigado.

Manager Carlos Ferreira 05/11/2019

Olá, Pedro!
Tudo bem?

Normalmente para consultas mais especificas para eu uso Query Builder, especialmente para filtros ordenação, porque o método orderBy do Laravel não aceita uma função de callback para aplicar regras customizadas.

Carlos Ferreira
Criador pedro castr 05/11/2019

Correção: O modelo Condition na verdade é Report.

Consegui realizar a consulta (não sei se da melhor forma):

$results = DB::table('reports')
->select('client_id', DB::raw('MAX(date) as maxdate'))
->groupBy('client_id')
->join('clients', 'reports.client_id', '=', 'clients.id')
->get();

foreach ($results as $key => $result) {
echo $result->maxdate;
echo "<br>";
}
dd();

Porém no modelo Report existe um campo 'condition' e é esse campo que me interessa. Ou seja, preciso consultar a condição mais recente deste cliente...

Já tentei passar 'condition' no select, porém nao consigo o groupBy('client_id'), sendo preciso passar groupBy('client_id', 'condition_id'). Parece que ele não 'amarra' os campos do select pela linha, também tenter where passando maxdate sem sucesso, estou travado aqui...

pedro castr
Criador pedro castr 05/11/2019

Finalmente cheguei em um resultado depois de muito quebrar a cabeça, mas ainda me falta segurança de estar fazendo de uma forma ineficiente. Poderia comentar, professor? Obrigado,

$clients = DB::table('clients')
->join('reports', 'clients.id', '=', 'reports.client_id')
->join(DB::raw('(select client_id, MAX(date) as maxdate
from reports group by client_id) as r'), function($join){
$join->on ( 'reports.client_id', '=', 'r.client_id' )
->on( 'reports.date', '=', 'r.maxdate');
})
->get();

foreach ($clients as $key => $clients) {
echo $clients->tag;
echo " - ";
echo $clients->condition_id;
echo " - ";
echo $clients->maxdate;
echo " <br> ";
}
pedro castr
Manager Carlos Ferreira 05/11/2019

Olá, Pedro!

Ficou OK o seu código, não enxerguei nada que desrespeite as boas práticas.

Apenas sugiro que trabalhe com repositories.

Esse loop que fez foi apenas para debug temporário, certo?

Carlos Ferreira
Criador pedro castr 05/11/2019

Sim, procuro fazer o debug em tela antes de implementar e mandar pra view.

Estou usando repositories sim professor.

Obrigado pela atenção.

pedro castr
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!