我一直在研究购物车应用程序,现在我遇到了以下问题..
有一个用户、一个产品和一个购物车对象。
Cart 表仅包含以下列:id、user_id、product_id 和时间戳。
UserModel 有Many Carts(因为一个用户可以存储多个产品)。
CartModel 属于一个用户,并且 CartModel 有许多产品。
现在计算我可以调用的总产品:Auth::user()->cart()->count()
。
我的问题是:如何获取此用户在购物车中的产品价格 SUM()
(一列产品)?
我想用 Eloquent 完成此操作,而不是使用查询(主要是因为我相信它更干净)。
Auth::user()->products->sum('price');
对于某些 Collection
方法,该文档有点简单,但除了可以在 http://laravel.com/docs/queries#aggregates 找到的 avg()
之外,所有查询构建器聚合似乎都可用。
这不是您的答案,而是为那些来这里寻找另一个问题的解决方案的人准备的。我想有条件地得到一列相关表的总和。在我的数据库中,交易有许多活动,我想从活动表中获取“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"
在交易属性中。
这是我现在想要得到的总和,而不是计数。
我尝试做类似的事情,这花了我很多时间才弄明白 collect() 函数。所以你可以这样:
collect($items)->sum('amount');
这将为您提供所有项目的总和。
collect()
collect()
用于将数组丰富为集合对象,但如果您一开始没有集合,最好只使用原始数组
你可以像这样使用 eloquent 轻松做到这一点
$sum = Model::sum('sum_field');
如果对其应用条件也很简单,它将返回字段总和
$sum = Model::where('status', 'paid')->sum('sum_field');
还使用查询生成器
DB::table("rates")->get()->sum("rate_value")
获取表费率内所有费率值的总和。
得到用户产品的总和。
DB::table("users")->get()->sum("products")
从版本 8 开始,Eloquent 上有一个 withSum
方法,所以你可以使用它。
Auth::user()->withSum('products', 'price')->products_sum_price;
这不会将所有产品加载到内存中,然后用收集方法进行汇总。相反,它将为数据库生成一个子查询,因此它更快并且使用更少的内存。
您可以将其作为 UserModel 属性传递。将此代码添加到 UserModel。
public function getProductPriceAttribute(){
return $this->cart()->products()->sum('price');
}
我假设是这样的:
UserModel 与名为 cart 的 CartModel 具有一对多关系
CartModel 与 ProductModel 命名产品具有一对多关系
然后你可以像这样得到产品的总价:
Auth::user()->product_price
对于只想快速将列中值的总和显示到刀片视图的人,您可以这样做:
{{ \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() }}
不定期副业成功案例分享
$sum = Auth::user()->cart()->products()->sum('price');
或您的产品表上的任何价格列。Cart
模型实际上只是数据透视表,因此我们不必包含它,因为在User
和Product
模型中使用您的关系方法处理了这一点。Auth::user()->products->sum('price');
。还要确保您已登录,以便 Auth 类知道要抓取哪个用户。您的购物车模型可能不应该具有products()
函数,因为它属于这种关系的User
模型。您甚至真的不需要Cart
的模型。products->sum
暗示它是在集合对象上调用 sum,而不是在 products() 返回的构建器对象上调用。值得澄清你在这里指的是哪一个,最好提供一个链接来解释两者。...->products->...
的关系将查询数据库以获取当前模型的所有相关产品,然后使用该内存中的集合。使用...->products()->...
只是修改正在构建的查询而不执行它,直到调用->sum()
之类的东西。后者可能更有效,因为它避免了将不必要的信息从数据库传输到内存。