Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Eloquent, SUM, join

Bom dia, queria saber como passar essa consulta para eloquent.

select sum(nota.valor * quesito.peso)/sum(quesito.peso) as total from nota 
join trabalho on(nota.trabalho_id = trabalho.id)
join quesito on (quesito.id = nota.quesito_id)
where trabalho.id = 2

OBS: Uso laravel 5.0

4 respostas

Tentativa 1

$trabalho = DB::table('trabalho')
                    ->join('nota','nota.trabalho_id','=','trabalho.id')
                    ->join('quesito','nota.quesito_id','=','quesito.id')
                    ->select('trabalho.id','trabalho.categoria_id','trabalho.titulo',(DB::raw('sum(nota.valor * quesito.peso)/sum(quesito.peso) as total')))
                    ->where('nota.trabalho_id','trabalho.id')->groupBy('trabalho.id')->get();

Oi Yuri.

O caminho é esse mesmo. Qual erro aconteceu quando você executou?

Uma dica é ir evoluindo a query em baby steps. Ou seja, primeiro você faz só um select simples, do trabalho.id por exemplo, e depois vai adicionando os joins e outras condições aos poucos, sempre testando a cada pequena mudança, pra identificar na mesma hora qual parte não está funcionando.

Queria saber como utilizar esse sum no eloquent, porque desse jeito não deu o que eu queria.

select sum(nota.valor * quesito.peso) as totalpesonota, sum(quesito.peso) as totalpeso, (sum(nota.valor * quesito.peso)/sum(quesito.peso)) as total
from nota 
join trabalho on(nota.trabalho_id = trabalho.id)
join quesito on (quesito.id = nota.quesito_id)
join avaliador on (avaliador.id = nota.avaliador_id)
where trabalho.id = 2 and avaliador.id = 1

Arrumei a consulta para visualizar melhor.

solução!

O sum precisa ser com o DB::raw mesmo, assim como você tinha feito na sua tentativa.

Tem um exemplo funcional aqui:

$sales = DB::table('order_lines')
        ->join('orders', 'orders.id', '=', 'order_lines.order_id')
        ->select(DB::raw('sum(order_lines.quantity*order_lines.per_qty) AS total_sales'))
        ->where('order_lines.product_id', $product->id)
        ->where('orders.order_status_id', 4)
        ->first();

retirado dessa thread do laravel.io:

http://laravel.io/forum/07-30-2014-sum-of-two-columns-multiplied-in-eloquent

Veja que ele faz o select direto nesse sum, sem outros campos, e usa o first() no final (já que o sum é unico)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software