در قسمت قبل پایگاه داده MySQL خود را به نام roxogram_db ساختیم و به صورت خلاصه با migration ها آشنا شدیم اما هنوز مباحث زیادی از migration ها مانده است که باید بررسی شود. در قدم اول می خواهم این فایل های migration را بررسی کنیم.
همانطور که گفتم migration ها راهی هستند که به صورت programmatically (با کد) جدول های مورد نظر در یک پایگاه داده را ایجاد کنیم. همچنین در جلسه قبل دستور زیر را اجرا کردیم:
php artisan migrate
این دستور تمام فایل های 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 نگاه کنید متوجه سادگی ساختار این فایل می شوید:
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 را برای من ساخته اند:
می توانید این تصویر از ساختار جدول users را با کدهای متد up در فایل create users table مقایسه کنید.
حالا تصور کنید که بخواهیم یک 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 رسمی مراجعه کنید:
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.