1
resposta

Usar métodos do Eloquent em Query

Gostaria de saber como posso implementar a seguinte query :

SELECT cli.id AS cliente_id, 
    cli.name AS nome,
    cli.cpfcnpj AS cpfcnpj, 
    v.id AS venda_id,
    SUM(total_venda.soma_total_venda) AS total
FROM  clientes cli
INNER JOIN vendas v ON cli.id = v.cliente_id 
INNER JOIN (SELECT p.id AS pedido_id, 
        p.venda_id AS venda_id, 
        p.produto_id, 
        p.quantity, 
        prod.price, 
        (p.quantity * prod.price) AS soma_total_venda 
    FROM pedidos p
    INNER JOIN vendas v ON p.venda_id = v.id 
    INNER JOIN produtos prod ON p.produto_id = prod.id) AS total_venda ON v.id = total_venda.venda_id
GROUP BY cli.id, v.id
ORDER BY v.id
LIMIT 0,10

sem utilizar o DB::select(); Aproveito para perguntar em quais casos é viável utilizar o DB::select() ao invés dos métodos do Eloquent para construção de queries.

1 resposta

Consegui resolver o problema da seguinte maneira:

    public function findAll()
    {
        $produtos = DB::table('pedidos AS p')->select(
                'p.id AS pedido_id',
                    'p.venda_id AS venda_id',
                    'p.produto_id',
                    'p.quantity',
                    'prod.price',
        DB::raw('(p.quantity * prod.price) AS soma_total_venda'))
        ->join('vendas AS v', 'p.venda_id', '=', 'v.id')
        ->join('produtos AS prod', 'p.produto_id', '=', 'prod.id');

        return  DB::table('clientes AS cli')->select(
            'cli.id AS cliente_id',
                    'cli.name AS nome',
                    'cli.cpfcnpj AS cpfcnpj',
                    'v.id AS venda_id',
                    DB::raw('SUM(total_venda.soma_total_venda) AS total')
            )
            ->join('vendas AS v', 'cli.id', '=', 'v.id')
            ->joinSub(
                $produtos, 'total_venda', function($join){
                    $join->on('v.id', '=', 'total_venda.venda_id');
        })->groupBy('cli.id', 'v.id')->get();
    }