Laravel 5.5: Как получить самые продаваемые товары данного магазина? - PullRequest
0 голосов
/ 26 мая 2018

Мои таблицы похожи на:

магазины [id]

запасы [id, shop_id]

заказы [id, shop_id]

order_item [order_id, inventory_id, quantity]

Модели:

//Shop
class Shop extends Model
{
    public function inventories()
    {
        return $this->hasMany(Inventory::class);
    }

    public function orders()
    {
        return $this->hasMany(Order::class);
    }
}

//Inventory
class Inventory extends Model
{
    public function shop()
    {
        return $this->belongsTo(Shop::class);
    }

    public function orders()
    {
        return $this->belongsToMany(Order::class, 'order_items')
                    ->withPivot('quantity');
    }
}

//Order
class Order extends Model
{
    public function shop()
    {
        return $this->belongsTo(Shop::class);
    }

    public function inventories()
    {
        return $this->belongsToMany(Inventory::class, 'order_items')
                    ->withPivot('quantity');
    }
}

Теперь я хочу 5 самых продаваемых запасов данного магазина, Каков будет лучший способ сделать это?

Я нахожусь на Laravel 5.5

Ответы [ 3 ]

0 голосов
/ 27 мая 2018

Во-первых, посмотрев на ваши столы по order_item , order_id и inventory_id наверняка будут звонить в один и тот же магазин?Я думаю, да, потому что если бы не вы, у вас было бы 2 разных магазина с одинаковым верхним порядком.Я не знаю, почему вы делаете это так, но это немного сбивает с толку, не могу понять, почему, но я бы попробовал это:

public function topOrders()
{
    $items = DB::table('shops')
                  ->join('orders', 'shops.id', '=', 'orders.shop_id')
                  ->join('inventories', 'shops.id', '=', 'inventories.shop_id')
                  ->join('order_items', 'orders.id', '=', 'order_items.order_id')
                  ->orderBy('quantity', 'desc')
                  ->take(5)
                  ->get();
    return $items;
}

То, что я написал, должно выбрать все из всех 3 строк, если вы хотитечтобы выбрать только те элементы, которые вы хотите выбрать, вы можете указать их, добавив предложение select

0 голосов
/ 30 мая 2018

Хотя это был мой собственный вопрос, я нашел решение самостоятельно и хочу поделиться этим решением с сообществом.Я хотел решить эту проблему с помощью Eloquent, потому что мне нужна модель в представлении, и я не хотел снова запрашивать модель.

    Inventory::where('shop_id', \Auth::user()->shop_id)
                    ->select(
                        'inventories.*',
                        \DB::raw('SUM(order_items.quantity) as quantity')
                    )
                    ->join('order_items', 'inventories.id', 'order_items.inventory_id')
                    ->groupBy('inventory_id')
                    ->get();

Надеюсь, это поможет кому-то с подобной проблемой.Спасибо

0 голосов
/ 27 мая 2018
select s.id,sum(oi.quantity) as total from munna.shops as s
join munna.inventories as iv on s.id=iv.shop_id
join munna.orders as o on iv.shop_id=o.shop_id
join munna.order_items as oi on o.id=oi.order_id
group by s.id
order by total desc limit 5
...