简体   繁体   English

Laravel Group按关系栏目

[英]Laravel Group By relationship column

I have Invoice_Detail model which handles all products and it's quantities, this model table invoice_details has item_id and qty columns. 我有Invoice_Detail模型,它处理所有产品及其数量,这个型号表invoice_detailsitem_idqty列。

The Invoice_Detail has a relation to Items model which holds all item's data there in its items table, which has item_id , name , category_id . Invoice_DetailItems模型有关系,该模型在其items表中保存所有项目的数据,该表具有item_idnamecategory_id

The Item model also has a relation to Category model which has all categories data in its categories table. Item模型还与Category模型有关系, Category模型的categories表中包含所有类别数据。

Question: I want to select top five categories from Invoice_Detail , how? 问题:我想从Invoice_Detail选择前五个类别,如何?

Here's what I did: 这是我做的:

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

But didn't work !! 但没有工作!!

[{"qty":"11043","item":null}]
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();

This will return you collection of top categories. 这将返回您的顶级类别集合。 Tested on laravel 5.5 and PostgreSQL. 在laravel 5.5和PostgreSQL上测试过。

UPD: To solve this without joins you can add to Categories model this: UPD:要在没有连接的情况下解决此问题,您可以添加到类别模型:

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

And to select top 5 categories: 并选择前5个类别:

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

But first solution with joins will work faster. 但是第一个带连接的解决方案会更快。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM