根据优惠券 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 之前使用的被识别。

  1. 识别出无效代码。但是有效代码也说无效代码。

我错过了什么? 我正在使用 Laravel 8 和 livewire。我尝试了很多方法。似乎没有任何效果。 我试过查询生成器。在某些时候,我能够通过使用内部连接和 user_coupons table 连接优惠券来获取用户使用的代码。我也尝试过使用模型关系,但它说集合不存在。

我确实在我的项目中实施了优惠券系统。我认为我们对此有相同的说法。你可以试试我的方法:

  1. 这是我的代金券 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)
];
  1. 这是我的voucher_redemptionstable,这个table是用户兑换代金券时使用的。我在 VoucherRedemption 模型中声明了它。
protected $fillable = [
   'redeemer_id', // user id who redeems the voucher
   'voucher_id', // voucher
   'item_id', // product item
];
  1. 这是我兑换代金券的功能
/**
 * 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;
}

谢谢。