[英]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_details
有item_id
和qty
列。
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_Detail
与Items
模型有关系,该模型在其items
表中保存所有项目的数据,该表具有item_id
, name
, category_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.