حتما اگه مدتی با لاراول کار کرده باشید میدونید که مایگریشن های لاراول چیزای خطرناکی ان 🙂 از این جهت که ممکنه یه چیزی رو مایگریت رول بک کنید و داده ای که دارید رو از دست بدید. خب سوالی که پیش میاد اینه که پس چجوری فیلد ها رو ادیت کنیم؟ داکیومنت مایگریشن خود لاراول پکیج doctrine/dbal رو پیشنهاد میکنه برای اینکه تغییرات رو روی جدول ها انجام بدیم.
فرض کنید اول کار من یه فیلد از مایگریشن ام رو اینجوری درست کردم:
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title', 500);
$table->text('body')->nullable();
$table->timestamps();
});
حالا میخوام به جدول یه فیلد دیگه اضافه کنم به اسم published. برای این کار به صورت زیر عمل میکنم که اول یه مایگریشن درست میکنم:
php artisan make:migration alter_posts_add_published_field
و بعد توی متد up کاری که میخوام رو انجام میدم:
Schema::table('posts', function (Blueprint $table) {
$table->boolean('published')->nullable();
});
با مایگریت کردن مجدد تغییراتی که دادید اعمال میشه. حالا فرض کنید همین فیلد آخری رو میخواید مقدار default واسش بذارید. برای تغییر در فیلدهای موجود پکیج زیر رو نصب کنید:
composer require doctrine/dbal
یه مایگریشن جدید درست میکنید:
php artisan make:migration alter_posts_add_default_value_to_published_field
و از فانکشن change برای اعمال تغییرات استفاده کنید:
Schema::table('posts', function (Blueprint $table) {
$table->boolean('published')->default(0)->change();
});
اگه تابع change
رو نذارید خطای زیر رو میگیرید چون فکر میکنه که دارید فیلد رو اضافه میکنید:
SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'published' (SQL: alter table `posts` add `published` tinyint(1) not null default '0')
اگه تابع change
رو بذارید آخر مایگریشن ولی dbal
نصب نباشه این خطا رو میگیرید که اینم مشخصه چی میگه:
Changing columns for table "posts" requires Doctrine DBAL. Please install the doctrine/dbal package.
نکته ی دیگه ای که باید مد نظر داشته باشیم اینه که اگر مثلا یه کلید خارجی دارید اضافه میکنید باید حواسمون باشه که کلید خارجی و لوکال با هم compatible باشن که البته این نکته توی ساخت همون مایگریشن ها هم مهمه دیگه.
اگه دیدید خیلی مایگریشن هاتون زیاد شدن میتونید با این فیچر از شرشون خلاص بشید.
موفق باشید 🙂
sad