بعضی از ترفندهای Migrationدر لاراول

همونطور که میدونید لاراول با امکانات زیادی ظاهر شده . یکی از این امکاناتش migration و ایجاد نیاز های دیتابیس هست . این که شما میتونید با نوشتن چند کد به راحتی این کار رو انجام بدید و جداول و ستون های خودتون رو بسازید عالیه . ولی بعضی وقت ها یک سری اتفاقات ، خطاها و چیز های مشابه اتفاق میفته که آدم رو عصبی میکنه . گفتم که با هم اینا رو بررسی کنیم . من راهکارهایی که میدم شاید جوابگو باشن ، اما درست نباشن . پس اگر راهکار دیگه ای میدونید کامنت کنین که اضافه کنیم . ترفند اول : Cannot add foreign key constraintفرض کنید که یک migration نوشتید به این شکل :$table->integer('user_id')->nullable(); $table->foreign('user_id')->references('id')->on('users');به نظر همه چیز درسته . یک ستون داریم که integer هست و مقادیر id در حدول users رو ذخیره میکنه و ما میخوایم relation بزنیم . اما این دستور رو که بزنید به شما این خطا رو میده :“Cannot add foreign key constraint”فقط همین . حرف دیگه ای هم نمیزنه . اما مشکل چیه؟مشکل اینه که ستون id داخل جدول users به شکل autoincrement هست که این مدل ستون به صورت پیشفرض unsigned هست و نمیتونین ستون از جنس signed رو به یک ستون unsigned مرتبط کنین . به همین دلیل کد رو به این شکل تغییر میدیم و موضوع حل میشه . $table->integer('user_id')->nullable()->unsigned(); $table->foreign('user_id')->references('id')->on('users');مورد دوم : افزودن ستون جدید به جدول موجود این مورد رو شاید با هر روشی بره . یک نفر rollback کنه و دوباره ایجاد کنه یا یک نفر refresh کنه . اما من کلا کار راحت رو ترجیح میدم . به نظرم بهتره یک migration جدا ایجاد کنیم . مثلا من میخوام یک ستون به جدول news اضافه کنم به اسم meta_description . کار زیر رو انجام میدیم :php artisan make:migration AddColumnMetaDescriptionToNewsTableبه عبارت AddColumnMetaDescriptionToNewsTable دقت کنید . این یک عبارت معنا داره . میگه : یک ستون به اسم MetaDescription به جدول news اضافه کن . زمانی که این عبارت معنا دار رو بنویسید ، لاراول خودش یک سری کدهای آماده داخل migration قرار میده . خروجی دستور بالا ، کد زیر هست :use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class AddColumnMetaDescriptionToNewsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('news', function (Blueprint $table) { // }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('news', function (Blueprint $table) { // }); } }حالا کافیه که متود up رو به شکل زیر تغییر بدید :public function up() { Schema::table('news', function (Blueprint $table) { $table->string('meta_description'); }); }حالا دستور migrate رو میزنیم و بدون هیچ مشکلی و از دست دادن اطلاعات داخل جدول ، جدول به روز میشه . php artisan migrateمورد دوم : عبارات معنا دار دیگریک سری عبارات دیگه هم هست که برای کار با migration به درد میخورن :php artisan make:migration CreateNewsTable php artisan make:migration add_title_to_news --table=newsدستور اول برای شما یک جدول با پیشفرض های مناسب میسازه . دستور دوم هم معادل کاری که بالا انجام دادیم هست به شکل دیگه . مورد سوم : تغییر یک ستون و ویرایشاتفاق افتاده که شما یک ستون رو میخواین تغییر بدید و از نوع integer به string ببرید یا هر کار دیگه . خوب برای این کار اول باید dbal رو نصب کنید . composer required doctrine/dbalحالا ایجاد migration php artisan make:migration ChangeNewsTitleInNewsTableخوب داخل متود up که ایجاد شده میریم و این کد رو میزاریم :public function up() { Schema::table('news', function (Blueprint $table) { $table->string('title',255)->nullable()->change(); }); }هر تغییری که خواستم رو دادم . title رو به string تغییر دادم و طولش رو 255 گذاشتم و اجازه دادم null باشه و در آخر با متود change تغییرات رو با migration آشنا کردم. حالا که migrate کنیم همه چیز به درستی تغییر میکنه . باز موردی بود بگید تا لیست رو کامل کنیم . ارادت