计算用户应该为购物车支付的所有费用
Calculate all the money user should pay for shopping cart
我有一个问题
我有一个名为 cart_product 的 table,它具有以下字段:
数量,价格,cart_id
我有一个主要的 table 叫做 carts
所以每个用户都有一个购物车 => 购物车
每个购物车都有很多产品 => cart_product
我想计算用户应该为他的购物车支付的所有费用,这意味着我应该为每个用户这样做:
总和 = 数量 * 价格
这是我的模型:
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_total_price
和价格。
最后一个解决方案不需要加载相关模型,因此可能会更快,但如果您想显示带有产品的购物车以及总数,请使用上述方法。
我有一个问题 我有一个名为 cart_product 的 table,它具有以下字段: 数量,价格,cart_id 我有一个主要的 table 叫做 carts 所以每个用户都有一个购物车 => 购物车 每个购物车都有很多产品 => cart_product
我想计算用户应该为他的购物车支付的所有费用,这意味着我应该为每个用户这样做: 总和 = 数量 * 价格
这是我的模型:
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_total_price
和价格。
最后一个解决方案不需要加载相关模型,因此可能会更快,但如果您想显示带有产品的购物车以及总数,请使用上述方法。