Find the best selling products (laravel / eloquent)

1

In laravel, supposing there is a 'Product' model (whose table is products), an 'Account' model (whose table is accounts), and an N: N relationship between accounts and products, in the table_product table, find an elegant way to fetch the 5 best selling products using laravel eloquent relationships.

Here's what I have code to date:

public function maisVendidos($quantidade)
    {

        $cp = ContaProduto::select('produto_id', DB::raw('count(*) as total'))
            ->groupBy('produto_id')
            ->orderBy('total', 'DESC')
            ->limit($quantidade)
            ->get();

        //inicializa um array de produtos + vendidos
        $produtos = [];

        //para cada ID encontrado, buscar o produto associado
        foreach($cp as $obj) {
            $produto = Produto::find($obj->produto_id);
            array_push($produtos, $produto);
        }

        return response()->json($produtos);
    }

Of course there is a way to relate through models, but I can not find documentation as an easy way to do this.

Can anyone more experienced give an idea?

Thank you!

EDIT: The models are:

    <?php namespace App;

use Illuminate\Database\Eloquent\Model;
use App\Categoria;
use App\Item;

class Produto extends Model {

    protected $table = 'produtos';  

    public function itens()
    {
        return $this->belongsToMany('App\Item');
    }

    public function categoria()
    {
        return $this->belongsTo('App\Categoria');
    }

    public function contas()
    {
        return $this->belongsToMany('App\Conta');
    }
}

<?php namespace App;

use Illuminate\Database\Eloquent\Model;
use App\Produto;

class Conta extends Model {

    protected $table = 'contas';
    protected $attributes = array(
            'valor' => 0.0,
            'encerrada' => 0
        );

    public function mesa()
    {
        return $this->belongsTo('App\Mesa');
    }

    public function produtos()
    {
        return $this->belongsToMany('App\Produto');
    }
}

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ContaProduto extends Model
{
    protected $table = 'conta_produto';
}
    
asked by anonymous 28.11.2017 / 14:26

1 answer

1

One way would be to search for all id of products in the conta_produto table and use method whereIn search for array of id returned, example :

public function maisVendidos($quantidade)
{
    $ids = ContaProduto::select('produto_id', DB::raw('count(*) as total'))
            ->groupBy('produto_id')
            ->orderByRaw('count(*) DESC')
            ->limit($quantidade)
            ->pluck('produto_id');

    $produtos = Produto::whereIn('id', ids)->get();
    return response()->json($produtos);
}

28.11.2017 / 19:34