Laravel Eloquent关系列的总和

时间:2014-02-10 14:20:58

标签: php laravel eloquent relation

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

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

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

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

7 个答案:

答案 0 :(得分:171)

Auth::user()->products->sum('price');

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

答案 1 :(得分:35)

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

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

它返回

"paid_sum_count" => "320.00"

在Deals属性中。

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

答案 2 :(得分:6)

我尝试过做类似的事情,这让我花了很多时间才弄清楚了collect()函数。所以你可以这样做:

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

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

答案 3 :(得分:1)

您可以像这样用雄辩的口才轻松做到

$sum = Model::sum('sum_field')

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

$sum = Model::where->('status','=','paid')->sum('sum_field')

答案 4 :(得分:0)

还使用查询生成器

DB::table("rates")->get()->sum("rate_value")

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

获取用户产品的总和。

DB::table("users")->get()->sum("products")

答案 5 :(得分:0)

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

public function getProductPriceAttribute(){
    return $this->cart()->products()->sum('price');
}

我假设是这样的:

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

然后你可以像这样得到产品的总价:

Auth::user()->product_price

答案 6 :(得分:0)

对于只想快速将列中值的总总和显示到刀片视图的人,您可以这样做:

{{ \App\Models\ModelNameHere::sum('column_name') }}

您也可以针对平均值执行此操作:

{{ \App\Models\ModelNameHere::avg('column_name') }}

最低:

{{ \App\Models\ModelNameHere::min('column_name') }}

最大:

{{ \App\Models\ModelNameHere::max('column_name') }}

要获取表的计数:

{{ \App\Models\ModelNameHere::count() }}