بعضی از ترفندهای 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 کنیم همه چیز به درستی تغییر میکنه .
باز موردی بود بگید تا لیست رو کامل کنیم .

ارادت