کاری که شما میخواید انجام بدید، تغییرات زیاد دیتابیسی نداره (البته به روش های متفاوتی میتونه پیاده سازی بشه که من یکی از ساده هاش رو خدمتتون عرض میکنم). تا اونجایی که من متوجه شدم، شما 2 تا کار کاملا جداگونه میخواید انجام بدید:
- دادن تخفیف به سفارش اولی ها (که توسط یک کد تخفیف معتبر اعمال میشه)
- دادن تخفیف به افرادی که شما رو به دیگران معرفی میکنن (مبتنی بر هم 2 نفر معرفی شده)
برای پیاده سازی منطق مکانیسم اول، شما صرفا یک جدول جدید احتیاج دارید که کدهای تخفیفتون رو اونجا ثبت میکنید که برای اعتبارسنجی کدهایی که کاربرهاتون وارد میکنن ازش استفاده میکنید. یک همچین چیزی:
// discountCodes
+----+--------+
| id | code |
+----+--------+
| 1 | FR5S9 |
| 2 | BG4HG |
+----+--------+
یک جدول هست با نام «کدهای تخفیف» (DiscountCodes) که یک سری کد با هر منطقی (میتونه رندوم باشه) توش ثبت شده. پس صرفا کافیه کدی که کاربر وارد میکنه رو به این صورت اعتبار سنجی بکنید:
SELECT 1 FROM discountCodes WHERE code = $enteredCode
که اگه کوئری بالا 1
رو برگردوند به این معنی هست که کدی که کاربر وارد کرده (یا همون $enteredCode
) جزو همون کدهای معتبر شما هست. اینجا یک مورد دیگه هم باید چک بشه و اون «سفارش اول بودن» هست. برای چک کردن این مورد باید از جدولی به اسم Orders (یا همون جدول سفارشات) استفاده کنید. قاعدتا همچین جدولی (حالا شاید با نام دیگه ای) رو دارید توی پروژتون که سفارشات ثبت شده کاربراتون رو توش نگهداری میکنید. خلاصه با یه همچین کوئری باید چک کنید که کاربر N# چندتا سفارش داشته تا حالا:
SELECT count(*) FROM orders WHERE user_id = '#N'
و طبیعتا بعدش چک میکنید که اگه خروجی کوئری بالا 0 هست - یعنی کاربر تا به حال سفارشی نداشته - و مشمول تخفیف میشه:
if ( $resOfQuery === 0 ){
ApplyDiscount($orderId); // یک تابع هست که باید بنویسیدش برای اعمال کردن تخفیف
} else {
// اولین سفارش کاربر نیست
حالا اینکه چقدر میخواید تخفیف بدید یا شاید بخواید بجای تخفیف روی سفارش، کیف پولش رو شارژ کنید و خلاصه تمام این منطق ها (business logic) توی همون تابع ApplyDiscount($orderId)
باید در نظر گرفته بشه.
برای پیاده سازی منطق مکانیسم دوم، شما کافیه به جدول users
ی که دارید دو ستون اضافه کنید که آیدی کسی که ایشون رو معرفی کرده رو توش ثبت میکنید و یک ستون دیگه که نشون میده برای این کاربر به معرفش تخفیف داده شده قبلا یا نه:
// users
+----+-------+---------------+----------+----------
| id | name | refered_by_id | expired | ...
+----+-------+---------------+----------+----------
| 1 | Ali | null | 0 |
| 2 | Vahid | 1 | 0 |
| 3 | Saed | 2 | 0 |
| 4 | Zahra | 1 | 0 |
+----+-------+---------------+----------+----------
نکته1: ستون refered_by_id
درواقع آیدی اون فردی رو نشون میده که ایشون رو معرفی کرده.
نکته2: ستون expired
نشون میده که تخفیف به معرف کاربر داده شده یک بار و دیگه نباید بهش تخفیف داده بشه.
از نظر UX هم اینطوری میتونه باشه که برای هر کاربر یک «کد معرف» یکتا وجود داشته باشه توی پروفایلش که بتونه اونو به دیگران بده (یا توسط شبکه های اجتماعی با سایرین به اشتراکش بزاره)، از اون طرف هم هر زمانی که کاربر جدید ثبت نام میکنه، توی پنل یا پروفایلش یه جایی باشه برای وارد کردن «کد معرف». دقیقا ایجا همون جاییه که شما باید ستون refered_by_id
رو با کد معرف تکمیل کنی. حالا باز میتونی یک کوئری دیگه داشته باشی برای اینکه چک کنی ببینی کاربر #N
، آیا 2 نفر رو معرفی کرده که هنوز ازشون تخفیف نگرفته یا نه:
SELECT count(*)
FROM users
WHERE refered_by_id = '#N'
AND expired = 0
کوئری بالا در واقع چک میکنه که کاربر #N
چه تعداد کاربر دیگه رو معرفی کرده که هنوز در ازاشون تخفیفی نگرفته. بعدم که چک میکنی اگر این عدد بزرگتر یا مساوی 2 بود، خب بهش تخفیف مد نظرت رو میدی. به این شکل:
if ( $resOfQuery >= 2 ){
ApplyDiscount($orderId);
// همچنین جدول کاربران بروزرسانی شود و 2 نفر معرفی شده باطل شوند، در ادامه توضیح دادم
} else {
// این کاربر هنوز 2 نفر را معرفی نکرده. اگر هم کرده، قبلا برایشان تخفیف گرفته و هنوز 2 نفر جدید را معرفی نکرده.
}
}
این هم بگم که حتما بعد از اعمال تخفیف باید بعدش جدول users
رو بروز رسانی (UPDATE users
) بکنی و بابت تخفیفی که بهش دادی 2 نفر از افرادی رو که معرفی کرده و هنوز براشون تخفیفی نگرفته رو باطل کنی. به این شکل:
UPDATE
SET expired = 1
WHERE refered_by_id = '#N'
AND expired = 0
LIMIT 2