我有Invoice_Detail
模型处理所有产品及其数量,此模型表invoice_details
包含item_id
和qty
列。
Invoice_Detail
与Items
模型有关系,该模型在其items
表格中保存所有项目的数据,该表格包含item_id
,name
,{{ 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();
答案 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);
但是第一个带连接的解决方案可以更快地运行。