یه برنامه نویس معمولی لینوکس کار
بعضی از ترفندهای 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 کنیم همه چیز به درستی تغییر میکنه .
باز موردی بود بگید تا لیست رو کامل کنیم .
ارادت
مطلبی دیگر از این انتشارات
تبدیل database به laravel migration درون mysql workbench 8
مطلبی دیگر از این انتشارات
نظرسنجی بهترین هاست لاراول در سال 99 ؟
مطلبی دیگر از این انتشارات
اموزش وارد کردن اطلاعات فیک در لاراول