Laravel eloquent 从不一定有关系的表关系中将数据从大到小排序
Posted
技术标签:
【中文标题】Laravel eloquent 从不一定有关系的表关系中将数据从大到小排序【英文标题】:Laravel eloquent sorts data from largest to smallest from table relations that do not necessarily have a relationship 【发布时间】:2021-12-04 13:33:36 【问题描述】:当从不一定与 php Laravel Eloquent 有关系的表关系中对数据进行从大到小排序时,我遇到了问题。
Table: items
|---------------------------|
| id | name | price |
|---------------------------|
| 1 | Samsung | 70.000 |
| 2 | iPhone | 90.000 |
| 3 | Nokia | 50.000 |
| 4 | Huawei | 80.000 |
| 5 | Xiaomi | 60.000 |
| 6 | LG | 40.000 |
|---------------------------|
Table: sells
|------------------------------------------|
| id | invoice | total | created_at |
|------------------------------------------|
| 1 | 1001 | 720.000 | 2021-10-01 |
| 2 | 1002 | 420.000 | 2021-10-01 |
| 3 | 1003 | 80.000 | 2021-10-15 |
|------------------------------------------|
Table: sell_items
|------------------------------------|
| id | sell_id | item_id | qty |
|------------------------------------|
| 1 | 1 | 1 | 5 |
| 2 | 1 | 2 | 4 |
| 3 | 2 | 3 | 3 |
| 4 | 2 | 2 | 3 |
| 5 | 3 | 4 | 1 |
|------------------------------------|
我只会从最大的数据中提取 5 个数据。
Top Product:
|--------------------------------|
| No | Product | Total (Qty) |
|--------------------------------|
| 1 | iPhone | 7 |
| 2 | Samsung | 4 |
| 3 | Nokia | 3 |
| 4 | Huawei | 1 |
| 5 | Xiaomi | 0 |
|--------------------------------|
我的语法:
$thisYear = date('Y');
$topProduct = SellItem::whereHas('sells', function($p) use ($thisYear)
$p->whereYear('created_at', $thisYear)
)
->whereHas('items')
->select('id', 'name', DB::raw('sum('qty') as total'))->take(5)->orderBy('total', 'desc')->get();
请帮我解决。
【问题讨论】:
SellItem
是sell_items
表的数据透视模型还是items
表的模型?
@Erin SellItem 是 sell_items 表。
【参考方案1】:
假设:
SellItem
是数据透视表的模型 sell_items
Item
是桌子上的模型items
Sell
是桌子上的模型sells
SellItem
具有 BelongsTo
关系 item
与 Item
SellItem
具有 BelongsTo
关系 sell
与 Sell
使用模型类中设置的关系,您可以执行以下操作:
$topProducts = SellItem::has('item')
->with('item')
->whereHas('sell', function ($query)
$query->whereYear('created_at', date('Y'));
)
->groupBy('item_id')
->withSum('qty as total')
->orderByDesc('total')
->get();
->map( function ($sell)
return $sell->item;
);
【讨论】:
以上是关于Laravel eloquent 从不一定有关系的表关系中将数据从大到小排序的主要内容,如果未能解决你的问题,请参考以下文章
快速向有关系的表中插入 200 多个数据 - Laravel 5.6
如何使用 laravel 模型呈现两个有关系的表,例如“sales”表和“sales_content”的情况