Consulta

[Finalizado Pelo Aluno]

pedro castr Criador 05/11/2019
pedro castr

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 06/11/2019
Carlos Ferreira

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.

Criador pedro castr 06/11/2019
pedro castr

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...

Criador pedro castr 06/11/2019
pedro castr

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> ";
}
Manager Carlos Ferreira 08/11/2019
Carlos Ferreira

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?

Criador pedro castr 11/11/2019
pedro castr

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

Estou usando repositories sim professor.

Obrigado pela atenção.

Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!