سرفصل‌های آموزشی
آموزش مقدماتی لاراول
چگونه یک Migration ایجاد کنیم؟

چگونه یک Migration ایجاد کنیم؟

در قسمت قبل با مفهوم مایگریشن آشنا شدیم. اکنون بیاید درمورد شیوه نوشتن فایل‌های مایگریشن صحبت کنیم. دو راه اصلی برای استفاده از کلاس Schema وجود دارد. متد create و متد table که تغییراتی روی جدول‌های موجود اعمال می‌کند.

public function up()

{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });

}

در مایگریشن جدول users ما از کلاس Blueprint برای تعریف ساختار مورد نظرمان استفاده میکنیم. در این نمونه، ابتدا از متد ()id استفاده کردیم.

$table->id();

این متد یک میانبر برای ایجاد ستونی از نوع big integer به عنوان کلید اصلی جدول است.

همچنین ستون name را داریم که با استفاده از متد ()string نوع آن varchar تعریف شده است.

$table->string('name');

ستون email را هم داریم که constraint ای از نوع unique برای آن تعریف شده است. این محدودیت باعث می شود که نتوانیم یک آدرس ایمیل را بیش تر از یکبار در جدول ذخیره کنیم.

$table->string('email')->unique();

در ادامه ستون های email_verified_at و password و remember_token تعریف شده اند که در این دوره با آن ها کار نمی‌کنیم. 

$table->timestamp('email_verified_at')->nullable();

$table->string('password');

$table->rememberToken();

در پایان از متد ()timestamps استفاده شده که دو ستون created_at و updated_at را از نوع timestamp برای ما ایجاد می‌کند.

این تمام کاری است که برای ایجاد یک جدول نیاز است انجام دهیم. در ادامه ایجاد یک جدول جدید و اعمال تغییر در یک جدول موجود را به صورت عملی انجام می‌دهیم. اکنون دستور php artisan migrate را دوباره اجرا می‌کنیم تا جدول users در دیتابیسمان ایجاد شود.

به ساختار جدول ایجاد شده نگاهی بیاندازید.

همانطور که می‌بینید ستون id از نوع big integer و به صورت unsigned  (تنها مقدارهای مثبت پذیرفته‌اند) به عنوان کلید اصلی تعریف شده است. ستون name هم از نوع varchar با طول 255 و ستون email با ایندکس unique تعریف شده است که دقیقا همان چیزی است که در فایل مایگریشن دیدیم.

تصور کنید پس از گذشت مدتی، نیاز می‌شود تا ستون جدید username را به جدول users اضافه کنید. در چنین شرایطی باید یک مایگریشن جدید ایجاد کنیم. مایگریشن‌های جدید هنگام اضافه کردن ستون به جدول‌های موجود و هنگام ایجاد جدول جدید کاربرد دارد. برای ایجاد یک مایگریشن جدید باید از دستور make:migration استفاده کنیم. برای  نمونه با دستور زیر یک مایگریشن می سازیم.

php artisan make:migration test

اگر به فایل مایگریشن ایجاد شده برویم، می‌بینیم که دو متد up و down بدون هیچ کدی قرار دارند. 

<?php


use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        //
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
    }

};

اگر نام مایگریشن‌مان را به شکلی دیگر انتخاب می‌کردیم، این متدها به همراه کدهای اولیه توسط لاراول ایجاد می‌شد. تصور کنید که می‌خواهیم مایگریشنی برای ایجاد جدول posts بنویسیم. نام آن را create_posts_table قرار می‌دهیم.

php artisan make:migration create_posts_table

اکنون به فایل ایجاد شده بروید.

<?php


use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }

};

لاراول با توجه به نامی که برای مایگریشن انتخاب کردیم، متوجه شده است که می‌خواهیم یک جدول جدید با نام posts ایجاد کنیم و کدهای اولیه را در متدهای up و down قرار داده است. اکنون کافی است ستون‌های مورد نظرمان را به این فایل اضافه کنیم.

کار دیگری که می‌توان با مایگریشن‌ها انجام داد، اعمال تغییرات در یک جدول موجود است. برای نمونه بیاید مایگریشنی جهت اضافه کردن ستون username به جدول users ایجاد کنیم.

php artisan make:migration add_username_to_users_table

با اجرای دستور بالا یک فایل جدید برای ما ایجاد می شود.

<?php


use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            //
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            //
        });
    }

};

کدهایی که در متد up و down این فایل نوشته شده است با مایگریشن مربوط به ایجاد جدول posts تفاوت دارد. در این مایگریشن از متد table کلاس Schema استفاده شده است. اکنون به صورت زیر، ستون username را به جدول users اضافه می‌کنیم.

public function up()

{
    Schema::table('users', function (Blueprint $table) {
        $table->string('username')->unique();
    });

}

این ستون را از نوع varchar و به صورت یکتا تعریف کردیم. در متد down چه کدی باید بنویسیم؟ برعکس اضافه کردن یک ستون به جدول چیست؟ با استفاده از متد ()dropColumn می‌توانیم ستونی را از جدول‌مان حذف کنیم.

public function down()

{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('username');
    });

}

اکنون اگر دستور php artisan migrate را اجرا کنیم، جدول users مان دوباره ایجاد نمی‌شود. زیرا مایگریشن مربوط به آن قبلا یک بار اجرا شده و این دستور تنها مایگرشن‌های جدید را اجرا می‌کند.

اکنون اگر ساختار جدول users را نگاه کنید، ستون username را مشاهده خواهید کرد.

با توجه به اینکه متد down مایگریشن‌هایمان را هم نوشتیم، به راحتی می‌توانیم تغییرات اعمال شده را برگردانیم. برای اینکار کافی است دستور php artisan rollback را اجرا کنیم.

با استفاده از مایگریشن‌ها در لاراول می‌توانیم ساختار و تغییرات پایگاه داده‌مان را به صورت کد ذخیره کنیم و هر جا که نیاز شد با اجرای دستور php artisan migrate آنها را در پایگاه داده‌مان اعمال کنیم. 

امیدوارم با مایگریشن‌ها و کاربرد آنها آشنا شده باشید. در قسمت بعد با شیوه ایجاد مدل و مایگریشن مربوط به آن آشنا می‌شویم.