ChatGPT解决这个技术问题 Extra ChatGPT

Laravel Eloquent Sum of relationship 的列

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

有一个用户、一个产品和一个购物车对象。

Cart 表仅包含以下列:id、user_id、product_id 和时间戳。

UserModel 有Many Carts(因为一个用户可以存储多个产品)。

CartModel 属于一个用户,并且 CartModel 有许多产品。

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

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


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

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


实际上这是有道理的,您必须将产品表添加到关系中,抱歉。试试 $sum = Auth::user()->cart()->products()->sum('price'); 或您的产品表上的任何价格列。
我只是试图复制这个问题,我认为我们让这件事变得太难了。您的 Cart 模型实际上只是数据透视表,因此我们不必包含它,因为在 UserProduct 模型中使用您的关系方法处理了这一点。 Auth::user()->products->sum('price');。还要确保您已登录,以便 Auth 类知道要抓取哪个用户。您的购物车模型可能不应该具有 products() 函数,因为它属于这种关系的 User 模型。您甚至真的不需要 Cart 的模型。
这对我有用!我停止使用购物车类。用户和产品现在都有一个 belongsToMany() 方法。现在我可以使用 price: {{ Auth::user()->products->sum('price') }} Thanx,这个案例解决了。
这里有些地方不太对劲 - 您的链接是指将聚合函数应用于数据库查询,但 products->sum 暗示它是在集合对象上调用 sum,而不是在 products() 返回的构建器对象上调用。值得澄清你在这里指的是哪一个,最好提供一个链接来解释两者。
@user3253002 使用不带括号 ...->products->... 的关系将查询数据库以获取当前模型的所有相关产品,然后使用该内存中的集合。使用 ...->products()->... 只是修改正在构建的查询而不执行它,直到调用 ->sum() 之类的东西。后者可能更有效,因为它避免了将不必要的信息从数据库传输到内存。
a
ahmad ali

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

$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"

在交易属性中。

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


这在许多情况下是最好的,因为您无需获取所有记录即可对其进行排序。
它工作正常,但我们必须在上述解决方案中添加 groupBy() 方法..
这必须被接受的答案
p
phil

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

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

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


该函数的名称实际上是 collect()
你可能最好只循环数组。 collect() 用于将数组丰富为集合对象,但如果您一开始没有集合,最好只使用原始数组
U
Ukesh

你可以像这样使用 eloquent 轻松做到这一点

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

如果对其应用条件也很简单,它将返回字段总和

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

A
Ahmed Mahmoud

还使用查询生成器

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

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

得到用户产品的总和。

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

m
miken32

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

Auth::user()->withSum('products', 'price')->products_sum_price;

这不会将所有产品加载到内存中,然后用收集方法进行汇总。相反,它将为数据库生成一个子查询,因此它更快并且使用更少的内存。


奇迹般有效。太糟糕了,你不能用这个方法给它一个个性化的名字:s。
A
Ahmad Budairi

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

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

我假设是这样的:

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

CartModel 与 ProductModel 命名产品具有一对多关系

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

Auth::user()->product_price

感谢您在 11 年后指出这一点。我想我现在可以继续这个项目了;)
@theAdmiral 喜欢看到 2025 年的时间旅行者
R
Ray

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

{{ \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() }}