Laravel Eloquent关系列的总和

the*_*ral 92 php relation laravel eloquent

我一直在做一个购物车应用程序,现在我遇到了以下问题..

有一个User,一个Product和一个Cart对象.
- Cart表仅包含以下列:"id","user_id","product_id"和时间戳.
- UserModel"hasMany"购物车(因为用户可以存储多个产品).
- CartModel"belongsTo"用户和CartModel"hasMany"产品.

现在计算我可以调用的总产品:Auth::user()->cart()->count().

我的问题是:如何获得此用户购物车中产品的价格(产品列)的SUM()?
我想用Eloquent完成这个,而不是使用查询(主要是因为我相信它更清洁).

use*_*496 195

Collection

对于某些avg()方法,文档略有说明,但除了Collection可以在http://laravel.com/docs/queries#aggregates上找到之外,所有查询构建器聚合似乎都可用.

  • 这里的东西不太合适 - 你的链接是指将聚合函数应用于数据库查询,但`products-> sum`意味着它是对集合对象的调用和,而不是对products()返回的构建器对象.值得澄清你在这里指的是哪一个,理想情况下提供一个解释两者的链接. (8认同)
  • 实际上这是有道理的,你必须将产品表添加到关系中,对不起.尝试`$ sum = Auth :: user() - > cart() - > products() - > sum('price');`或产品表上的价格列. (3认同)
  • @user3253002 使用不带括号 `...->products->...` 的关系将查询数据库以获取当前模型的所有相关产品,然后使用该内存集合。使用 `...->products()->...` 只是修改正在构建的查询而不执行它,直到调用类似 `->sum()` 之类的东西。后者可以更有效,因为它避免了不必要的传输信息从数据库进入内存。 (2认同)

ahm*_*ali 46

这不是你的答案,而是那些来到这里寻找另一个问题的解决方案.我想有条件地得到一列相关表的总和.在我的数据库中,交易有许多活动,我想从活动表中获取"amount_total"的总和,其中activities.deal_id = deal.id和activities.status =已付款所以我这样做了.

$query->withCount([
'activity AS paid_sum' => function ($query) {
            $query->select(DB::raw("SUM(amount_total) as paidsum"))->where('status', 'paid');
        }
    ]);
Run Code Online (Sandbox Code Playgroud)

它返回

"paid_sum_count" => "320.00"
Run Code Online (Sandbox Code Playgroud)

在Deals属性中.

现在这是我想得到的总和而不是计数.

  • 这只是withCount的精彩使用! (6认同)
  • 这在许多情况下是最好的,因为您可以按顺序排序而无需获取所有记录. (3认同)

小智 13

我尝试做类似的事情,在我弄清楚collect()函数之前花了很多时间.所以你可以这样做:

collect($items)->sum('amount');

这将为您提供所有项目的总和.

  • 函数的名称实际上是`collect()` (4认同)

小智 11

你可以像这样轻松地使用 eloquent

$sum = Model::sum('sum_field');
Run Code Online (Sandbox Code Playgroud)

它会返回一个字段的总和,如果在它上面应用条件也很简单

$sum = Model::where('status', 'paid')->sum('sum_field');
Run Code Online (Sandbox Code Playgroud)


vst*_*har 11

withSum从版本 8 开始, Eloquent 上有一个方法,所以你可以使用这个方法。

Auth::user()->withSum('products', 'price')->products_sum_price;
Run Code Online (Sandbox Code Playgroud)

这不会将所有产品加载到内存中,然后用集合方法求和。相反,它会生成数据库的子查询,因此速度更快并且使用更少的内存。


小智 7

您可以将其作为 UserModel 属性传递。将此代码添加到 UserModel。

public function getProductPriceAttribute(){
    return $this->cart()->products()->sum('price');
}
Run Code Online (Sandbox Code Playgroud)

我假设是这样的:

  • UserModel 与名为cart的 CartModel 具有一对多关系
  • CartModel 与名为products的 ProductModel 具有一对多关系

然后你可以得到产品的总价,如下所示:

Auth::user()->product_price
Run Code Online (Sandbox Code Playgroud)

  • 感谢您在 11 年后指出这一点。我想我现在可以继续这个项目了;) (2认同)

Ahm*_*oud 5

还使用查询生成器

DB::table("rates")->get()->sum("rate_value")
Run Code Online (Sandbox Code Playgroud)

获取表费率内所有费率值的总和。

获得用户产品的总和。

DB::table("users")->get()->sum("products")
Run Code Online (Sandbox Code Playgroud)