根据优惠券 table- Laravel 8 - Livewire 使用一次或两次优惠券。应用折扣 Laravel
Use coupon once or twice based on the coupons table- Laravel 8 - Livewire. Apply Discounts Laravel
我有一个实施优惠券系统的项目。
问题是,一个用户可以多次使用一张优惠券,直到优惠券过期为止。
我想:
根据优惠券中定义的最大使用量限制优惠券使用量 table;
我也在 google 中寻找过各种网站。其中包括 Whosebug 和其他。
id
code
type
value
cart_value
expiry_date
timestamps
max
Max- 优惠券可以使用的最长时间。
枢轴table:user_coupons
id
coupon_id
user_id
code
此处的代码列存储特定优惠券已使用的次数。
应用优惠券方法。
public function applyCouponCode()
{
$promo = Coupon::where('code', $this->couponCode)
->where('expiry_date', '>=', Carbon::today())
->where('cart_value', '<=', Cart::instance('cart')->subtotal())
->first();
$coupon = Coupon::with('userCoupon')
->where('expiry_date', '>=', Carbon::today())
->where('code', '!=', 'user_coupons.code')
->where('cart_value', '<=', Cart::instance('cart')->subtotal())
->first();
if ($coupon->userCoupon()->code === $this->couponCode) {
$this->alert('error', 'Code already used!');
return;
// dd($coupon->code);
} else if (!$promo) {
$this->alert('error', 'Invalid code!');
return;
} else if ($coupon) {
$this->alert('success', 'Code ok!');
return;
}
//this part never appears. Even though coupon is valid
$this->alert('success', 'Coupon is applied');
}
问题:
1.codes 之前使用的被识别。
- 识别出无效代码。但是有效代码也说无效代码。
我错过了什么?
我正在使用 Laravel 8 和 livewire。我尝试了很多方法。似乎没有任何效果。
我试过查询生成器。在某些时候,我能够通过使用内部连接和 user_coupons
table 连接优惠券来获取用户使用的代码。我也尝试过使用模型关系,但它说集合不存在。
我确实在我的项目中实施了优惠券系统。我认为我们对此有相同的说法。你可以试试我的方法:
- 这是我的代金券 table 属性。我在凭证模型中将其声明为可填充属性。
protected $fillable = [
'service_id',
'code',
'name',
'description',
'percentage', // percentage of discount
'maximum_value', // maximum value of discount
'maximum_usage', // maximum usage per user. If it's 1, it means user only can use it once.
'user_terms', // additional terms
'amount', // amount of voucher. If it's 1, it means the voucher is only can be redeemed once.
'expired_at',
'is_active', // for exception if we want to deactivate the voucher (although voucher is valid)
];
- 这是我的voucher_redemptionstable,这个table是用户兑换代金券时使用的。我在 VoucherRedemption 模型中声明了它。
protected $fillable = [
'redeemer_id', // user id who redeems the voucher
'voucher_id', // voucher
'item_id', // product item
];
- 这是我兑换代金券的功能
/**
* Apply voucher to an item
* @param int $redeemerId user id
* @param string $voucherCode voucher code
* @param int $itemId project batch package id
* @return VoucherRedemption $redemption
*/
public static function apply($redeemerId, $voucherCode, $itemId)
{
$voucher = Voucher::where('code', $voucherCode)->first();
// Make sure item is exist and the batch has not been checked out
$item = ProjectBatchPackage::where('id', $itemId)->first();
if (!$item) {
return;
} else if ($item->batch->status != null) {
return;
}
// Make sure voucher exist
if (!$voucher) {
return;
}
// Make sure is voucher active, not expired and available.
if ($voucher->is_active == false || $voucher->isExpired() || !$voucher->isAvailable()) {
return;
}
// Make sure voucher usage for user
if ($voucher->maximum_usage != null) {
$user_usages = VoucherRedemption::where('redeemer_id', $redeemerId)
->where('voucher_id', $voucher->id)
->get()
->count();
if ($user_usages >= $voucher->maximum_usage) {
return;
}
}
// Apply voucher to project batch package (item)
$redemption = VoucherRedemption::create([
'redeemer_id' => $redeemerId,
'voucher_id' => $voucher->id,
'item_id' => $itemId
]);
return $redemption;
}
谢谢。
我有一个实施优惠券系统的项目。 问题是,一个用户可以多次使用一张优惠券,直到优惠券过期为止。 我想: 根据优惠券中定义的最大使用量限制优惠券使用量 table;
我也在 google 中寻找过各种网站。其中包括 Whosebug 和其他。
id
code
type
value
cart_value
expiry_date
timestamps
max
Max- 优惠券可以使用的最长时间。
枢轴table:user_coupons
id
coupon_id
user_id
code
此处的代码列存储特定优惠券已使用的次数。
应用优惠券方法。
public function applyCouponCode()
{
$promo = Coupon::where('code', $this->couponCode)
->where('expiry_date', '>=', Carbon::today())
->where('cart_value', '<=', Cart::instance('cart')->subtotal())
->first();
$coupon = Coupon::with('userCoupon')
->where('expiry_date', '>=', Carbon::today())
->where('code', '!=', 'user_coupons.code')
->where('cart_value', '<=', Cart::instance('cart')->subtotal())
->first();
if ($coupon->userCoupon()->code === $this->couponCode) {
$this->alert('error', 'Code already used!');
return;
// dd($coupon->code);
} else if (!$promo) {
$this->alert('error', 'Invalid code!');
return;
} else if ($coupon) {
$this->alert('success', 'Code ok!');
return;
}
//this part never appears. Even though coupon is valid
$this->alert('success', 'Coupon is applied');
}
问题:
1.codes 之前使用的被识别。
- 识别出无效代码。但是有效代码也说无效代码。
我错过了什么?
我正在使用 Laravel 8 和 livewire。我尝试了很多方法。似乎没有任何效果。
我试过查询生成器。在某些时候,我能够通过使用内部连接和 user_coupons
table 连接优惠券来获取用户使用的代码。我也尝试过使用模型关系,但它说集合不存在。
我确实在我的项目中实施了优惠券系统。我认为我们对此有相同的说法。你可以试试我的方法:
- 这是我的代金券 table 属性。我在凭证模型中将其声明为可填充属性。
protected $fillable = [
'service_id',
'code',
'name',
'description',
'percentage', // percentage of discount
'maximum_value', // maximum value of discount
'maximum_usage', // maximum usage per user. If it's 1, it means user only can use it once.
'user_terms', // additional terms
'amount', // amount of voucher. If it's 1, it means the voucher is only can be redeemed once.
'expired_at',
'is_active', // for exception if we want to deactivate the voucher (although voucher is valid)
];
- 这是我的voucher_redemptionstable,这个table是用户兑换代金券时使用的。我在 VoucherRedemption 模型中声明了它。
protected $fillable = [
'redeemer_id', // user id who redeems the voucher
'voucher_id', // voucher
'item_id', // product item
];
- 这是我兑换代金券的功能
/**
* Apply voucher to an item
* @param int $redeemerId user id
* @param string $voucherCode voucher code
* @param int $itemId project batch package id
* @return VoucherRedemption $redemption
*/
public static function apply($redeemerId, $voucherCode, $itemId)
{
$voucher = Voucher::where('code', $voucherCode)->first();
// Make sure item is exist and the batch has not been checked out
$item = ProjectBatchPackage::where('id', $itemId)->first();
if (!$item) {
return;
} else if ($item->batch->status != null) {
return;
}
// Make sure voucher exist
if (!$voucher) {
return;
}
// Make sure is voucher active, not expired and available.
if ($voucher->is_active == false || $voucher->isExpired() || !$voucher->isAvailable()) {
return;
}
// Make sure voucher usage for user
if ($voucher->maximum_usage != null) {
$user_usages = VoucherRedemption::where('redeemer_id', $redeemerId)
->where('voucher_id', $voucher->id)
->get()
->count();
if ($user_usages >= $voucher->maximum_usage) {
return;
}
}
// Apply voucher to project batch package (item)
$redemption = VoucherRedemption::create([
'redeemer_id' => $redeemerId,
'voucher_id' => $voucher->id,
'item_id' => $itemId
]);
return $redemption;
}
谢谢。