سلام آقای خسروجردی، خسته نباشید.
اگه بخوایم فیلد جدید به یک جدول از دیتابیس اضافه کنیم یا تغییری در جدول های دیتابیس بدیم بدون اینکه اطلاعات مون حذف بشه باید چیکار کنیم؟
یک روش داخل ویدیوهای دوره گفتید که می تونیم یک migration جدید اضافه کنیم و اون تغییری رو که در جدول مورد نظرمون می خوایم بدیم داخلش بنویسیم مثل کد زیر مثلا که اسم migration اون add_province_id_to_addresses_table هست
public function up()
{
Schema::table('addresses', function (Blueprint $table) {
$table->foreignId('province_id')->after('user_id')->nullable()->constrained('provinces')->onUpdate('cascade')->onDelete('cascade');
});
}
که به migration زیر اضافه میشه به اسم create_addresses_table :
public function up()
{
Schema::create('addresses', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->nullable()->constrained('users')->onUpdate('cascade')->onDelete('cascade');
$table->foreignId('city_id')->nullable()->constrained('cities')->onUpdate('cascade')->onDelete('cascade');
$table->string('postal_code');
$table->text('address');
$table->string('no');
$table->string('unit');
$table->string('recipient_first_name')->nullable();
$table->string('recipient_last_name')->nullable();
$table->string('mobile')->nullable();
$table->tinyInteger('status')->default(0);
$table->timestamps();
$table->softDeletes();
});
}
1. ولی من نمی خوام از این روش استفاده کنم چون اینجوری تعداد migration ها خیلی زیاد میشه.
2. یک مشکل دیگه هم که هست اینه که کاربر ممکنه زمانی که ما تغییری در جدول میدیم یک رکورد به جدول اضافه کنه و با تغییری که می خوایم بدیم تداخل داشته باشه.
به نظرتون برای این 2 مشکل باید چیکار کنیم؟
سلام وقت بخیر
برای جلوگیری از زیاد شدن تعداد مایگریشنها، میتوانید مایگریشنهای قبلی را اصلاح کرده و سپس با دستور migrate:fresh دیتابیس را از نو بسازید. (البته این روش فقط در محیط توسعه مناسب است و در پروژههای در حال اجرا توصیه نمیشود.)
برای جلوگیری از تداخل هنگام تغییر جدول، باید ابتدا دیتابیس را قفل کنید (مثلاً با استفاده از Maintenance Mode لاراول: php artisan down)، سپس تغییرات را اعمال و بعد سیستم را دوباره فعال کنید (php artisan up).
وقتی پروژه روی هاست deploy شده و کاربران رکوردهاشون رو داخل دیتابیس ثبت کردند، اگه با دستور (php artisan down ) دیتابیس رو قفل کنیم و یک فیلد جدید داخل یکی از جداول دیتابیس اضافه کنیم و دوباره با دستور (php artisan up) سیستم رو فعال کنیم، چجوری باید migrate بگیریم که فیلد جدید اضافه بشه و رکوردهای کاربران حذف نشه؟ چون ما هر جوری که migrate بگیریم رکوردهای کاربران حذف میشه و جدول رو دوباره میسازه مگر اینکه migration جدید برای فیلد جدید بسازیم؟
دقیقاً درسته: وقتی پروژه روی هاست هست و دیتای کاربران وجود داره، نباید از migrate:fresh یا تغییر مستقیم مایگریشنهای قدیمی استفاده بشه، چون این دستورات جدولها رو پاک و دوبارهسازی میکنن.
راه حل درست و امن:
حتماً باید یک migration جدید بسازید (مثلاً add_new_field_to_table) که فقط همون فیلد جدید رو اضافه کنه. این کار:
رکوردهای قبلی رو حفظ میکنه
ساختار جدول رو بهروز میکنه
هیچ دیتایی رو حذف نمیکنه
برای جلوگیری از تداخل هنگام migrate روی هاست:
سیستم رو با php artisan down ببرید به حالت نگهداری
دستور php artisan migrate رو بزنید (نه migrate:fresh)
بعد از موفقیت، php artisan up بزنید
پس بله، تنها روش امن در محیط production اینه که migration جدید بنویسید، نه ویرایش مایگریشنهای قدیمی.