کار با Schema Builder و Migration
در هنگام ایجاد migration می توانید نام جدول را هم در دستور مشخص کنید .
php artisan make:migration create_users_table --create=users
برای نامگزاری فایل migration معمولا از یک نام با مسما که نشانده عملیات موردنظرمان است استفاده میکنیم مثلا برای افزودن یک ستون جدید به نام votes در جدول users به این صورت فایل را نامگزاری و ایجاد میکنیم :
php artisan make:migration add_votes_to_users_table --table=users
بعضی از عملیات های دیتابیس ممکن است مخرب باشند و هنگامی در جداول دیتابیس داده ای وجود داشته باشد باعث از بین رفتن برخی داده ها شود برای محافظت از این خطرات از دستور migaret به صورت زیر استفاده کنید و در پایان آن force-- را قرار دهید :
php artisan migrate --force
همانطور که در پست قبل دیدید از دستور rollback استفاده کردیم که این دستور روی آخرین عملیات migration عمل میکند. برای اینکه همه عملیات ها را rollback کنیم از دستور migrate:reset استفاده میکنیم و در صورتی که بخواهیم همه عملیات ها rollback و سپس دوباره اجرا شوند از migrate:refresh استفاده میکنیم.
php artisan migrate:resetphp artisan migrate:refresh
فرض کنید میخواهیم ستون ایمیل را به جدول users اضافه کنیم ابتدا فایل migration ای ایجاد و سپس در متد up آن دستور زیر را می نویسیم :
Schema::table('users', function($table)
{
$table->string('email');
//$table->string('name')->after('email');});
در متد down هم دستورات زیر را قرار میدهیم :
Schema::table('users', function($table)
{
$table->dropColumn('email');
});
حالا با اجرای دستور php artisan migrate ستون موردنظر ایجاد خواهد شد. همچنین می توانیم با استفاده از after آن را بعد از ستون خاصی در دیتابیس قرار دهیم وگرنه به انتهای جدول افزوده می شود.
همانطور که در پست قبل هم گفتم متدهای بسار زیادی برای تعریف ستون ها وجود دارد که می توانید از اینجا با هرکدام آشنا شوید.
برای تغییر نام جدول از متد rename از کلاس Schema مانند مثال اول در زیر استفاده کنید. با استفاده drop هم می توانیم جدولی را حذف کنیم و dropIfExists هم ابتدا بررسی میکند اگر جدول وجود داشت آن را حذف میکند.
Schema::rename($from, $to);
Schema::drop('users');
Schema::dropIfExists('users');
برای ویرایش یک ستون ابتدا بایستی مطمئن شوید که وابستگی doctrine/dbal روی فریمورک نصب شده باشد در غیر اینصورت مانند زیر عمل کنید:
در بخش require فایل composer.json آن را اضافه کرده :
"require": {
"laravel/framework": "5.0.*",
"illuminate/html": "~5.0",
"doctrine/dbal": "2.5.*",
},
سپس از دستور composer update در ترمینال برای نصب این وابستگی استفاده کنید.
همانند مثال زیر می توانیم یک ستون را ویرایش کنیم. در مثال زیر طول ستون name را به ۵۰ کاراکتر تغییر داده و آن را قابل NULL بودن تعریف میکنیم:
Schema::table('users', function($table)
{
$table->string('name', 50)->nullable()->change();
});
برای افزودن کلید خارجی به یک جدول هم به این صورت عمل میکنیم :
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
ابتدا یک ستون unsigned عددی به نام user_id ایجاد کردیم و سپس در پایین آن را کلید خارجی تعریف کردیم و گفتیم که مرجعی از ستون id از جدول users می باشد.
همچنین می توانیم خاصیت onDelete آن راهم تعیین کنیم :
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
برای حذف کلید خارجی هم همانند مثال زیر عمل میکنیم :
$table->dropForeign('posts_user_id_foreign');
با استفاده از متد hasTable می توانیم بررسی کنیم آیا جدول موردنظر وجود دارد یا خیر و یا با استفاده از متد hasColumn بررسی کنیم در جدول موردنظر ستون های موردنظرمان وجود دارد یا خیر:
if (Schema::hasTable('users'))
{
//
}
if (Schema::hasColumn('users', 'email'))
{
//
}
برای افزودن و حذف ایندکس می توانیم همانند مثال های زیر عمل کنیم :
$table->string('email')->unique();
$table->dropUnique('email');
برای حذف ستونهای زمانی هم مانند مثال های زیر عمل کنید:
$table->dropTimestamps();
$table->dropSoftDeletes();
همچنین می توانیم موتور ذخیره سازی دیتابیس را هم مشخص کنیم :
$table->engine = 'InnoDB';