userValidCoupons($user); //判断券在这批商品中是否可用 $availableCouponIds = []; $availableCoupons = []; foreach ($coupons as $coupon) { if (in_array($coupon->coupon_id, $availableCouponIds)) {//遇到同样的券ID时直接跳过 $availableCoupons[] = $coupon; } else { if ($this->isAvailableCouponToSomeSku($skus, $coupon)) { $availableCouponIds[] = $coupon->coupon_id; $availableCoupons[] = $coupon; } } } return collect($availableCoupons); } /** * 用户有效的优惠券 * * @param User $user * @return collection */ public function userValidCoupons(User $user): collection { return UserCoupon::with('ranges')->where([ 'user_id'=>$user->id, 'status'=>0, ])->where('use_start_at', '<=', now())->where('use_end_at', '>=', now())->get(); } /** * 这批商品中,这个券是否可用 * * @return boolean */ protected function isAvailableCouponToSomeSku(collection $skus, UserCoupon $coupon) { $res = false; foreach ($skus as $sku) { if ($sku instanceof ProductSku && $this->isAvailableCouponToSku($sku, $coupon)) { $res = true; break;//提前退出循环 } } return $res; } /** * 这个商品是否可用这个券 * * @param ProductSku $productSku * @param Coupon $coupon * @return boolean */ protected function isAvailableCouponToSku(ProductSku $sku, UserCoupon $coupon) { $res = false; foreach ($coupon->ranges as $range) { switch ($range->type) { case 1://指定商品分类 if (in_array($sku->category_id, explode(',', $range->ranges))) { $res = true; } break; case 2://指定商品IDS if (in_array($sku->id, explode(',', $range->ranges))) { $res = true; } break; } if ($res) {//如果可用提前跳出循环; break; } } return $res; } }