اینکه استفاده کردن از Enum توی migration لاراول کار درستیه یا بهترین راهه یا نه، تصمیمش با شماست و شاید تو یه مقالهی مستقل بهش پرداختم. اما در صورتی که تصمیم به استفاده از type نسبتاً پر طرفدار Enum گرفتید احتمالا برای اعمال تغییرات در آینده روی این column به مشکل جدی بر بخورید!
بریم یه migration بسازیم که یه column از نوع Enum داره:
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateProductsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('products', function (Blueprint $table) { $table->id(); $table->string('name'); $table->enum('status', ['Pending', 'Wait', 'Active']); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('products'); } }
توی همین migration دقت کنید که `status` مقدار پیشفرضی نداره!
به این شکل میتونیم همون column رو با یک مقدار پیشفرض بسازیم:
$table->enum('status', ['Pending', 'Wait', 'Active'])->default('Pending');
به جای قشنگش رسیدیم که معمولاً کسی برای انجامش راه حلی نداره! فرض کنید پروژه چند ماهه که run شده و تعدادی یوزر هم داره که از سایت استفاده میکنند، حالا بیزینس پروژه به شکلی تغییر کرده که status باید یک حالت دیگه رو هم به نام Completed پشتیبانی کنه! اما چطور باید این کار رو بکنیم؟
برای انجام این کار باید یک migration جدید ایجاد کنیم و کد زیر رو توش بنویسیم:
<?php use Illuminate\Database\Migrations\Migration; class UpdateStatusColumn extends Migration { /** * Run the migrations. * * @return void */ public function up() { \DB::statement("ALTER TABLE `products` CHANGE `status` `status` ENUM('Pending','Wait','Active', 'Completed') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'Pending';"); } /** * Reverse the migrations. * * @return void */ public function down() { } }
توی تصویر زیر میتونید تائیدیهی این تغییر توی دیتابیس رو مشاهده کنید:
این مقاله ترجمه شده است. متن اصلی را در این لینک مشاهده کنید.