Php 计算用户应为购物车支付的所有费用

Php 计算用户应为购物车支付的所有费用,php,laravel,shopping,Php,Laravel,Shopping,我有个问题 我有一个名为cart_product的表,其中包含以下字段: 数量、价格、购物车id 我有一张叫carts的主桌 所以每个用户都有一个购物车=>购物车 每个购物车都有很多产品=>cart\u产品 我想计算用户应该为他的购物车支付的所有费用,这意味着我应该为每个用户这样做: 总和=数量*价格 这是我的模型: class Cart extends Model { protected $with = 'coupon'; protected $fillable = [

我有个问题 我有一个名为cart_product的表,其中包含以下字段: 数量、价格、购物车id 我有一张叫carts的主桌 所以每个用户都有一个购物车=>购物车 每个购物车都有很多产品=>cart\u产品

我想计算用户应该为他的购物车支付的所有费用,这意味着我应该为每个用户这样做: 总和=数量*价格

这是我的模型:

class Cart extends Model
{
    protected $with = 'coupon';
    protected $fillable = [
        'user_id', 'coupon', 'total'
    ];

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function products()
    {
        return $this->belongsToMany(Product::class, 'cart_product')->withPivot(['qty', 'price']);
    }

    public function coupon()
    {
        return $this->belongsTo(Coupon::class);
    }
}

我可以用求和函数吗?感谢

集合的求和函数允许您使用函数作为“聚合器”(可能是错误的单词)示例

以下方面应起作用:

$cart = Cart::with('products')->first();
$totalPrice = $cart->products->sum(function ($product) {
   return $product->pivot->price*$product->pivot->qty;
});

为了方便起见,我将把它添加为一个属性(但如果这样做,请小心,因为它需要加载产品,如果不需要,它将执行查询,这可能会很昂贵)

将此添加到您的购物车模型中:


public function getTotalPriceAttribute() {
    return $this->products->sum(function ($product) {
        return $product->pivot->price*$product->pivot->qty;
    });
}

这之所以方便,是因为您可以执行以下操作:

$totalPrice = $cart = Cart::with('products')->first()->total_price;
这当然适用于单个购物车。如果用户有多个购物车,您可以通过以下方式计算用户必须支付的所有费用:

$totalForUser = $user->carts->sum(function ($cart) {
     return $cart->total_price;
});
但是,如果您希望在不加载相关产品的情况下直接通过查询获取价格,则可以执行普通的旧联接:

    Cart::join('cart_product', 'carts.id', 'cart_product.cart_id')
         ->selectRaw('carts.*, SUM(cart_product.qty*cart_product.price) as total_cart_price')
         ->groupBy('carts.id', ...) // needs all the `carts` columns in the group by
这将导致每个购物车结果都有一个带有价格的
$cart->cart\u总价


最后一个解决方案不需要加载相关模型,因此可能会更快,但如果您想显示包含产品和总计的购物车,请使用上述方法。

是的,您可以:
{your query code}->sum('price')
。非常有用。谢谢