آشنایی با مفهوم Migrations و نحوه‌ی کار با آن

Familiarity with the Concept of Migrations and How to Work with it

25 بهمن 1399
Laravel 7.0: آشنایی با مفهوم Migrations و نحوه ی کار با آن (قسمت 06)

در قسمت قبل پایگاه داده MySQL خود را به نام roxogram_db ساختیم و به صورت خلاصه با migration ها آشنا شدیم اما هنوز مباحث زیادی از migration ها مانده است که باید بررسی شود. در قدم اول می خواهم این فایل های migration را بررسی کنیم.

همانطور که گفتم migration ها راهی هستند که به صورت programmatically (با کد) جدول های مورد نظر در یک پایگاه داده را ایجاد کنیم. همچنین در جلسه قبل دستور زیر را اجرا کردیم:

php artisan migrate

این دستور تمام فایل های migration را اجرا می کند که باعث ایجاد جدول های زیر در پایگاه داده ما شد:

migration های لاراول جدول های مورد نظر ما را ساخته اند
migration های لاراول جدول های مورد نظر ما را ساخته اند

اما چطور؟ بیایید از پوشه database و سپس پوشه migrations فایل create users table را باز کرده و به محتوای آن نگاه کنیم:

<?php

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

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    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();
        });
    }

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

همانطور که می بینید تمام migration ها کلاس هایی هستند که کلاس پدر Migration را extend می کنند. همچنین درون این کلاس ها دو متد up و down داریم:

  • متد up مسئول ساخت پایگاه داده است (Schema::Create) و همان متدی است که با اجرای php artisan migrate اجرا می شود.
  • متد down دقیقا برعکس متد up است (Schema::dropIfExists) و جدول های ساخته شده را حذف می کند.

اگر به متد up نگاه کنید متوجه سادگی ساختار این فایل می شوید:

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();
    });
}

دستور schema::create یک جدول جدید می سازد. آرگومان اول (users) نام جدولی است که قرار است ساخته شود، آرگومان دوم نیز یک تابع است که ستون های این جدول را مشخص می کند. برای مشخص کردن هر ستون از ساختار زیر استفاده کرده ایم:

$table->datatype()

به طوری که datatype یک نوع داده باشد. مثلا در اینجا اگر موس خود را روی ()id<-table$ (قسمت id) ببرید نوشته ای به شکل زیر برایتان ظاهر می شود:

Create a new auto-incrementing big integer (8-byte) column on the table.

بنابراین ()id یک big integer می سازد و big integer هم از data type های MySQL است که باید با آن آشنا باشید. بنابراین شما می توانید با نگه داشتن موس خود روی هر کدام از دستور ها، نحوه کارکرد آن را ببینید. مثلا من موس را روی ()unqiue نگه می دارم و نوشته زیر ظاهر می شود:

Add a unique index

بنابراین unique یک ایندکس یکتا می سازد. یا اگر موس را روی ()nullable ببریم:

Allow NULL values to be inserted into the column

یعنی به این ستون یا فیلد اجازه می دهد که مقدار NULL را نیز قبول کنند. بنابراین به سادگی می توان فهمید که همه اینها همان مفاهیم MySQL است و واقعا چیز جدیدی برای یادگیری وجود ندارد. اگر می خواهید تمام کدهای ممکن (انواع datatype) برای migration ها را ببینید باید به documentation رسمی لاراول به آدرس زیر مراجعه کنید:

https://laravel.com/docs/7.x/migrations#creating-columns

حالا متوجه می شویم که چطور این کدها جدول users را برای من ساخته اند:

ساختار ستون های جدول ساخته با migration ها
ساختار ستون های جدول ساخته با migration ها

می توانید این تصویر از ساختار جدول users را با کدهای متد up در فایل create users table مقایسه کنید.

ساخت یک Migration جدید

حالا تصور کنید که بخواهیم یک migration جدید (یا به عبارتی یک جدول جدید در پایگاه داده) بسازیم. با اینکه می توانید این کار را به صورت دستی انجام بدهید اما اصلا توصیه نمی شود چرا که امکان خطا بالا می رود. برای ساخت یک migration جدید باید به صورت زیر عمل کنید:

php artisan make:migration my_new_migration

به جای my_new_migration باید نام migration دلخواه خود را قرار بدهید. با اجرای این کد فایلی به نام زیر در پوشه migrations ساخته می شود:

2020_06_21_060250_my_new_migration.php

این فایل حاوی کدهای زیر است:

<?php

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

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

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

بنابراین این دستور یک ساختار صحیح و کلی را برایتان می سازد اما متد های up و down آن خالی است و شما باید خودتان هر ستون از جدول مورد نظر را مشخص کند که اصلا کار سختی نیست. من نیازی به این فایل ندارم بنابراین آن را حذف می کنم اما اگر شما با این فایل دستور php artisan migrate را اجرا کرده باشید، می توانید با دستور زیر جدول جدید را حذف کنید:

php artisan migrate:rollback

این دستور، migration شما را یک مرحله به عقب می برد که در مثال ما می شود حذف جدولی که جدیدا ساخته شده است. نتیجه ای که با اجرای دستور بالا می گیریم:

Rolling back: 2020_06_21_060250_my_new_migration

Rolled back:  2020_06_21_060250_my_new_migration

یعنی فایل my_new_migration برگشته یا به عبارتی rollback شده است که یعنی دیگر در پایگاه داده ما نیست (می توانید از PHPMyAdmin چک کنید). در واقع تمام دستورات ممکن برای migration ها را در لیست زیر مشاهده می کنید:

  migrate:fresh        Drop all tables and re-run all migrations
  migrate:install      Create the migration repository
  migrate:refresh      Reset and re-run all migrations
  migrate:reset        Rollback all database migrations
  migrate:rollback     Rollback the last database migration
  migrate:status       Show the status of each migration

در طول این دوره بیشتر با migration ها کار عملی خواهیم کرد اما این جلسه به نوعی برای شما زمینه سازی می کند تا در آینده مشکلی نداشته باشید. یادتان باشد که بحث migration ها بسیار طولانی است و اگر خواستید برای اطلاعات بیشتر به لینک زیر از documentation رسمی مراجعه کنید:

https://laravel.com/docs/7.x/migrations

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری ساخت اینستاگرام با Laravel 7 توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.