سلام دوستان
من یه جدول دیتابیس دارم که شامل اطلاعات دورههاست به اینصورت:
public function up()
{
Schema::create('courses', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('status');
$table->string('type');
$table->string('price');
$table->timestamps();
});
}
این دورهها هر کدوم دارای محتوای ویدئویی و همچنین میتونند آزمون و تکلیف و ... یکسری آپشنهای دیگه داشته باشند. دورههایی که فقط محتوا دارند رو افراد میتونند رایگان ثبتنام کنند. ولی ما الان میخوایم برای بعضی ازین دورهها آزمون تعریف کنیم و به یه قیمتی به فروش برسونیم. الان من توی طراحی جداول دیتابیسش مشکل دارم که چطور فردی رو که قبلا توی دوره ثبتنام کرده رو با گرفتن یه هزینهای دسترسی آزمون بدم. شبیه سایت مکتبخونه.
public function up()
{
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->string('course_id');
$table->string('user_id');
$table->string('status');
$table->string('price');
$table->timestamps();
});
}
سلام دوست عزیز
موضوع خیلی ساده هست فقط نیازمند اینه که شما موضوع رو برای خودت خیلی واضح کنی
شما یک سری درس داری که اشخاص یا دسترسی بهش دارند یا ندارند کاری بهش نداریم
یک سری ازمون داری که لازمه ی اون دادن هزینه هست
خب خیلی راحت یک جدول رابط بین اشخاص و ازمون ها میزاری و رابطه چند به چند هم هست
یعنی یک شخص میتونه هزینه n آزمون رو داده باشه و یک ازمون میتونه توسط n شخص هزینش پرداخت شده باشه و در دسترسشون باشه
منطق این کار مثل سطح دسترسی و Role و Permission هست از نظر پیاده سازی دیتابیسی (اگر دوره پروژه محور لاراول راکت رو دیده باشید )
در کل شما بر اساس نیاز میتونی جدول درس شخص داشته باشی (course_user) و دیگ جدول قبلی و یا واسط دیگری نیازت نشه.
مثلا بگی شخص به درس دسترسی داره ؟ به ازمون مربوط به این درس چطور ؟ به تکلیفش چطور ؟
در صورتی که این کار رو بکنی با یک جدول همه ی این موارد راحت چک میشه
مثلا جدول زیر
Schema::create('course_user', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->unsignedBigInteger('course_id');
$table->foreign('course_id')->references('id')->on('cource')->onDelete('cascade');
$table->boolean('has_access_to_exam')->default(false);
$table->boolean('has_access_to_practice')->default(false);
$table->boolean('has_access_to_x')->default(false);
$table->boolean('has_access_to_y')->default(false);
$table->timestamps();
});
البته نیاز به id و timestamps هم نیست معمولا توی جدول واسط رابطه ای و کلید اصلی میشه ترکیب دو کلید خارجی
شما با جدول واسط مربوط به درس و شخص همه ی دسترسی ها رو هم بررسی و نگهداری میکنی
کلا بستگی به مکانیزم منطقی و پیاده سازی شما داره که چی بخواید و چیکار کنید وگرنه راه حل که زیاد داره باید ببینید کدوم بهتره براتون
خیلی ممنون.🙏
من همش تو فکر یه جدول جدید برای آپشنهای دوره بودم ولی انگار راه حل شما مناسبتره.
در موردش فکر میکنم اگر مشکلی داشتم مزاحمتون میشم.😁
سلام نگار🖐
امیدوارم حالت خوب و عالی باشی✨
دیتابیسی که شما طراحی کردی تا حدودی درسته ، اما چند تصحیح کوچک نیاز داره .
جدول courses
:
courses
شما یک ستون به نام status
دارید که به طور احتمالی برای نشان دادن وضعیت دوره مانند "فعال" یا "غیرفعال" استفاده میشود. اگر وضعیتهای متفاوتی برای دورهها دارید (مثلاً "فعال", "غیرفعال", "در حال برگزاری" و غیره)، میتوانید از یک مقدار عددی استفاده کنید (مثلاً 1 برای فعال و 0 برای غیرفعال) و یک جدول جداگانه برای وضعیتها ایجاد کنید.جدول course_user
:
course_user
شما ستونهای has_access_to_exam
, has_access_to_practice
, has_access_to_x
, و has_access_to_y
داری این روش مناسب نیست زیاد چرا چون که اگع تعداد آپشنها زیاد باشه، تعداد ستونها زیاد میشه و قیمه میره تو ماستا . به جای این روش، میتونی از یک جدول جدید به نام course_options
استفاده کنی.جدول course_options
:
id
(شناسه یکتا)course_id
(کلید خارجی به جدول courses
برای ارتباط با دوره مربوطه)option_name
(نام آپشن، مثلاً "آزمون" یا "تکلیف")price
(قیمت مربوط به آپشن اگر قابل خرید است، در غیر این صورت 0 یا null)با این تغییرات، میتوانید به راحتی کاربرانی که به دورهها ثبتنام کردهاند را با گرفتن هزینههای مرتبط با آپشنهایی که انتخاب کردن ، مدیریت کنی و تمام 👌.
امیدوارم پاسخم بهت کمک کرده باشه ❤️
موفق و پیروز باشی 🤘🌹
ممنون.
با این طراحی باید از کجا بفهمم که کاربر به کدوم آپشن دسترسی داره و پولشو پرداخت کرده؟
@mahdi.nazari
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟