Laravel雄辩的关系总和


110

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

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

现在,我可以计算出总产品数:Auth::user()->cart()->count()

我的问题是:如何获得该用户购物车中产品的价格(产品列)的SUM()?
我想用Eloquent而不是使用查询来完成此操作(主要是因为我认为它更干净)。

Answers:


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

该文档对某些Collection方法没有什么帮助,但是除了avg()可以在http://laravel.com/docs/queries#aggregates上找到之外,所有查询构建器聚合似乎都可用。


哇,谢谢你的快速回复。现在它只是说没有价格栏。看来雄辩的是根本没有看那个产品表...
–Admiral

3
实际上,这很有意义,对不起,您必须将产品表添加到该关系中。尝试$sum = Auth::user()->cart()->products()->sum('price');或在产品表上输入“价格”列。
user1669496 2014年

1
那对我有用!我停止使用购物车类。现在,用户和产品都有一个belongsToMany()方法。现在,我可以使用价格了:{{Auth :: user()-> products-> sum('price')}}谢谢,这种情况已经解决了。
2014年

9
这里有些不对劲-您的链接指向将聚合函数应用于数据库查询,但products->sum意味着它是对集合对象的调用总和,而不是对products()返回的构建器对象的总和。值得弄清楚您在此表示的意思,并且最好提供一个链接来解释这两种情况。
Benubird 2014年

1
@ user3253002使用不带括号的关系...->products->...将查询数据库以获取当前模型的所有相关产品,然后使用该内存中的集合。使用...->products()->...just可以修改正在构建的查询,而无需执行直到查询被->sum()调用为止。后者可以提高效率,因为它避免了将不必要的信息从数据库传输到内存中。
Siegen

62

这不是您的答案,而是针对那些来这里寻找另一个问题的解决方案的人。我想有条件地获取相关表的列的总和。在我的数据库中,Deals有很多Activity,我想从Activitys表中获取“ amount_total”的总和,其中activity.deal_id = deal.id,而activity.status =已支付,所以我做到了。

$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属性中。

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


3
在许多情况下,这是最好的方法,因为您可以按其排序而不必获取所有记录。
Sabrina Leggett

15

我尝试做类似的事情,这花了我很多时间才能弄清楚collect()函数。因此,您可以通过以下方式进行操作:

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

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


4
该功能的名称实际上是collect()
莱昂纳多·比尔

您最好只循环数组。collect()用于充实数组到一个集合对象,但如果你没有在第一时间收集它可能是最好只使用原始阵列
火焰

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.