Laravel Group按关系栏目

时间:2018-02-01 13:28:28

标签: php laravel group-by eloquent laravel-5.5

我有Invoice_Detail模型处理所有产品及其数量,此模型表invoice_details包含item_idqty列。

Invoice_DetailItems模型有关系,该模型在其items表格中保存所有项目的数据,该表格包含item_idname,{{ 1}}。

category_id模型还与Item模型有关系,该模型的Category表中包含所有类别数据。

问题:我想从categories中选择前五个类别,如何?

这就是我的所作所为:

Invoice_Detail

但是没有用!!

$topCategories = InvoiceDetail::selectRaw('SUM(qty) as qty')
    ->with(['item.category' => function($query){
        $query->groupBy('id');
    }])
    ->orderBy('qty', 'DESC')
    ->take(5)->get();

1 个答案:

答案 0 :(得分:1)

Category::select('categories.*',\DB::raw('sum("invoice_details"."qty") as "qty"'))
        ->leftJoin('items', 'items.category_id', '=', 'categories.id')
        ->leftJoin('invoice_details', 'invoice_details.item_id', '=', 'items.id')
        ->groupBy('categories.id')
        ->orderBy('qty','DESC')
        ->limit(5)
        ->get();

这将返回您的顶级类别集合。 在laravel 5.5和PostgreSQL上测试过。

<强> UPD: 要在没有连接的情况下解决此问题,您可以添加到“模型”这个:

public function invoiceDetails()
{
    return $this->hasManyThrough(Invoice_Detail::class, Item::class);
}

并选择前5个类别:

$top = Category::select()->with('invoiceDetails')
    ->get()->sortByDesc(function($item){
        $item->invoiceDetails->sum('qty');
    })->top(5);

但是第一个带连接的解决方案可以更快地运行。