每个用户仅使用laravel优惠券一次

时间:2018-03-11 13:47:50

标签: php laravel cart coupon

我有推车系统,一切正常,我唯一的问题是;每个用户可以反复使用相同的优惠券代码

  

我想要的是限制每个用户只能使用每张优惠券   一旦如果用户有多个优惠券代码,则只能使用   其中一个

这是我的购物车更新功能,我的购物车将使用优惠券代码等进行更新。

public function update(Request $request, $id)
    {
      // quantity
      $qty = $request->input('quantity');
      $products = Product::findOrFail($request->proId);
      $stock = $products->stock;
      $mytime = Carbon::now();
      $couponcode = $request->input('coupon');

      $catId = Coupon::where('category_id', $products->category_id)
                    ->where('value_to', '>=', $mytime)
                    ->when($couponcode, function ($query) use ($couponcode) {
                          return $query->where('title', $couponcode);
                      })
                      ->first();

      if (!empty($qty) && !empty($couponcode)) { // 1. if both (quantity and couponcode) are given
          if ($qty < $stock && (!is_null($catId) && $catId->title == $couponcode)) { // if quantity < stock AND coupon-code is correct

              $coupon = new \Darryldecode\Cart\CartCondition(array(
                  'name' => $catId->title,
                  'type' => 'coupon',
                  'target' => 'item',
                  'value' => -$catId->amount,
              ));

              Cart::update($id, array(
                  'quantity' => array(
                      'relative' => false,
                      'value' => $qty,
                  ),
              ));
              Cart::addItemCondition($id, $coupon);

              Session::flash('success', 'Cart updated.');
              return redirect()->route('cart.index');

          } elseif ($qty > $stock) {
              Session::flash('danger', 'quantity not available!');
              return redirect()->route('cart.index');
          } else {
              Session::flash('danger', 'invalid coupon code!');
              return redirect()->route('cart.index');
          }
      } elseif (!empty($qty)) { // 2. if just quantity is given   
          if ($qty < $stock) {

              Cart::update($id, array(
                  'quantity' => array(
                      'relative' => false,
                      'value' => $qty,
                  ),
              ));

              Session::flash('success', 'Cart updated.');
              return redirect()->route('cart.index');

          } else {
              Session::flash('danger', 'quantity not available!');
              return redirect()->route('cart.index');
          }
      } elseif (!empty($couponcode)) { // 3. if just couponcode is given
          if (!is_null($catId) && $catId->title == $couponcode) {

              $coupon = new \Darryldecode\Cart\CartCondition(array(
                  'name' => $catId->title,
                  'type' => 'coupon',
                  'target' => 'item',
                  'value' => -$catId->amount,
              ));

              Cart::addItemCondition($id, $coupon);

              Session::flash('success', 'Coupon applied successfully.');
              return redirect()->route('cart.index');

          } else {
              Session::flash('danger', 'invalid coupon code!');
              return redirect()->route('cart.index');
          }
      } else{ // 1. if nothing is given
            Session::flash('danger', 'Your request cannot be handle, please try again!');
            return redirect()->route('cart.index');
        }
    }

更新

我想出了这个查询,以获取我的购物车商品条件名称

$cartItems = Cart::getContent();
      foreach($cartItems as $item)
      {
          if(is_array($item['conditions']) && !empty($item['conditions'])) {
            $temp = [];
            foreach($item['conditions'] as $key => $value)
            {
                $temp[]=[
                    'name' => $value->getName(),
                ];

            }
            $item['_conditions'] = $temp;
            foreach($item['_conditions'] as $itessm)
            {
              $copname[] = $itessm['name'];
            }
          }
      }

现在$copname是条件名称,存储在我的购物车会话中,我需要更改我的功能(上图)以便比较输入优惠券,看看我的条件是否存在,如果不是让用户添加它,但已经存在返回错误。

类似的东西:

if( $couponcode == $copname )

任何想法?

更新2

我将代码更改为:

$cartItems = Cart::getContent();
      foreach($cartItems as $item)
      {
          if(is_array($item['conditions']) && !empty($item['conditions'])) {
            $temp = [];
            foreach($item['conditions'] as $key )
            {
                $temp[] = $key['name'];
            }
          }
      }

我得到的结果如下:

如果不存在条件:[]

如果存在条件:array 2: 0 => 'xxxx', and so on

然后我改变了我的更新功能,如:

    $cartItems = Cart::getContent();
          foreach($cartItems as $item)
          {
              if(is_array($item['conditions']) && !empty($item['conditions'])) {
                $temp = [];
                foreach($item['conditions'] as $key )
                {
                    // $temp[] = $key['name'];
                    $temp[] = $key['name'];

                }
                $item['_conditions'] = $temp;
              }
          }

//this IF has added
          if($couponcode == $item['_conditions']){
            Session::flash('danger', 'You already used this coupon, you cannot use it again!');
            return redirect()->route('cart.index');
          }else{
            $catId = Coupon::where('category_id', $products->category_id)
                              ->where('value_to', '>=', $mytime)
                              ->when($couponcode, function ($query) use ($couponcode) {
                                    return $query->where('title', $couponcode);
                                })
                                ->first();
          }

现在问题在于我得到了这个错误:

  

不能使用Darryldecode \ Cart \ CartCondition类型的对象作为数组

1 个答案:

答案 0 :(得分:0)

您应该这样做,以便用户只能在登录后使用优惠券。

一旦他们使用优惠券,只需将其存储到数据库中,并将其与用户帐户相关联。

当他们进入优惠券输入页面时,一旦他们输入优惠券详细信息,请拨打ajax电话并检查优惠券是否对他们有效使用。

如果您正在使用的应用程序是开箱即用的软件,我个人会创建一个名为UsedCoupon的表,并为其提供至少2列UserId和CouponCode。我会在那里存储我用过的代码。

如果从头开始创建应用程序,您可能会以更加非规范化的方式存储使用过的优惠券数据。