求和列的 Laravel 多重关系
Posted
技术标签:
【中文标题】求和列的 Laravel 多重关系【英文标题】:Laravel Multiple Relationship for a sum column 【发布时间】:2021-08-23 06:12:43 【问题描述】:我有三个模型,名称为 Invoices、Invoiceitems 和 Products。
每张发票与 Invoiceitems 模型有很多关系。
每个 Invoiceitems 与 Products Model 有一个关系。
我需要将产品类别为 4 的 Invoiceitem 产品金额相加。
表结构
发票
标识 |日期 | total_amt
发票项目
标识 |发票ID |产品编号 |产品_amt |数量 | total_amt
产品
标识 |产品名称 | category_id
关系
发票模型
public function invoiceitems()
return $this->hasMany('App\Invoiceitems', 'invoiceid', 'id');
发票项目模型
public function products()
return $this->hasOne('App\Products', 'id', 'product_id');
预期报告
发票编号 |日期 |蔬菜类产品数量 | NonVeg 类别产品数量 |总金额
KL0001 | 15-05-2021 | 0.00 | 190.366 | 190.366
KL0002 | 16-05-2021 | 20.00 | 350.000 | 370.000
目前我们使用以下Helper Function来获取特定类别产品总金额
function getInvdiscsumamt($inv_id, $prdtype)
$totaldisamt = Invoiceitems::Where('invoice_id', $inv_id)->whereHas('products', function ($query) use ($prdtype)
$query->where('category_id', $prdtype);
)->sum('total_amt');
return $totalpdtamt;
如何使用 Elequoent 方法显示特定类别产品的总金额
【问题讨论】:
【参考方案1】:您可以尝试 Eloquent 中已经存在的聚合函数之一,参见 https://laravel.com/docs/8.x/eloquent-relationships#other-aggregate-functions,例如 withSum
:
$invoiceItem = InvoiceItem::query()
->where('invoice_id', $invId)
->withSum(['products', function($query) use ($productType)
$query->where('category_id', $productType);
, 'frequency'])
->first();
然后您的属性将使用属性relation_function_column
可用,因此在本例中为products_sum_frequency
。
请注意,withSum
不与 with
(或 whereHas
)函数共享任何内容,这意味着如果您在查询中使用子选择,例如 ->with(['products', function($query)...])
,这将是与 @ 的单独选择987654330@查询。
我还建议在您的函数和模型中使用正确的驼峰法。我还会为您的所有模型类名称使用单数名称。所以Invoiceitems
会变成InvoiceItem
(models/InvoiceItem.php
)。据我所知,这是在 laravel 中定义它的默认方式。
【讨论】:
以上是关于求和列的 Laravel 多重关系的主要内容,如果未能解决你的问题,请参考以下文章