求和列的 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 多重关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8 工厂的多重关系

Laravel 多重关系

Laravel中的多重关系(枢轴)

Laravel中多对多关系的多重搜索子句

Laravel:Eloquent模型中的多重多态关系

laravel 与 json 列的关系