نسخه:

پایگاه داده: مهاجرت

معرفی

مهاجرت ها مانند کنترل نسخه برای پایگاه داده شما هستند که به تیم شما اجازه می دهد تا تعریف طرحواره پایگاه داده برنامه را تعریف و به اشتراک بگذارد. اگر تا به حال مجبور شده اید به یک هم تیمی بگویید که پس از اعمال تغییرات خود از کنترل منبع، به صورت دستی ستونی را به طرح پایگاه داده محلی خود اضافه کند، با مشکلی روبرو شده اید که انتقال پایگاه داده حل می کند.

Schema نمای لاراول برای ایجاد و دستکاری جداول در تمامی سیستم های پایگاه داده پشتیبانی شده لاراول، پشتیبانی آگنوستیک پایگاه داده را فراهم می کند. به طور معمول، مهاجرت از این نما برای ایجاد و اصلاح جداول و ستون های پایگاه داده استفاده می کند.

ایجاد مهاجرت

می توانید از make:migration دستور Artisan برای ایجاد انتقال پایگاه داده استفاده کنید. انتقال جدید در database/migrations دایرکتوری شما قرار خواهد گرفت. هر نام فایل مهاجرت حاوی یک مهر زمانی است که به لاراول اجازه می دهد ترتیب مهاجرت ها را تعیین کند:

php artisan make:migration create_flights_table

لاراول از نام مهاجرت برای حدس زدن نام جدول و اینکه آیا مهاجرت یک جدول جدید ایجاد می کند یا خیر استفاده می کند. اگر لاراول بتواند نام جدول را از روی نام مهاجرت تعیین کند، لاراول فایل مهاجرت تولید شده را با جدول مشخص شده از قبل پر می کند. در غیر این صورت، می توانید به سادگی جدول موجود در فایل مهاجرت را به صورت دستی مشخص کنید.

اگر می خواهید یک مسیر سفارشی برای مهاجرت ایجاد شده مشخص کنید، می توانید --path هنگام اجرای make:migration دستور از این گزینه استفاده کنید. مسیر داده شده باید نسبت به مسیر پایه برنامه شما باشد.

له کردن مهاجرت ها

همانطور که برنامه خود را می سازید، ممکن است به مرور زمان مهاجرت های بیشتری را جمع آوری کنید. این می تواند منجر به پر شدن دایرکتوری شما database/migrations با صدها مهاجرت شود. در صورت تمایل، می‌توانید مهاجرت‌های خود را به یک فایل SQL تبدیل کنید. برای شروع، schema:dump دستور را اجرا کنید:

php artisan schema:dump
 
# Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune

هنگامی که این دستور را اجرا می کنید، لاراول یک فایل "schema" در دایرکتوری برنامه شما می نویسد database/schema . نام فایل طرحواره با اتصال پایگاه داده مطابقت دارد. اکنون، زمانی که می‌خواهید پایگاه داده خود را انتقال دهید و هیچ انتقال دیگری انجام نشده است، لاراول ابتدا دستورات SQL را در فایل طرحواره اتصال پایگاه داده مورد استفاده شما اجرا می‌کند. پس از اجرای دستورات SQL فایل طرحواره، لاراول هرگونه مهاجرت باقیمانده را که بخشی از schema dump نبوده، اجرا خواهد کرد.

اگر آزمایش‌های برنامه شما از اتصال پایگاه داده متفاوتی نسبت به اتصالی که معمولاً در طول توسعه محلی استفاده می‌کنید استفاده می‌کند، باید مطمئن شوید که یک فایل طرحواره را با استفاده از آن اتصال پایگاه داده ریخته‌اید تا آزمایش‌های شما بتوانند پایگاه داده شما را بسازند. ممکن است بخواهید پس از تخلیه اتصال پایگاه داده ای که معمولاً در طول توسعه محلی استفاده می کنید، این کار را انجام دهید:

php artisan schema:dump
php artisan schema:dump --database=testing --prune

شما باید فایل شمای پایگاه داده خود را به کنترل منبع بسپارید تا دیگر توسعه دهندگان جدید در تیم شما به سرعت ساختار پایگاه داده اولیه برنامه شما را ایجاد کنند.

له کردن مهاجرت فقط برای پایگاه‌های داده MySQL، PostgreSQL و SQLite در دسترس است و از سرویس گیرنده خط فرمان پایگاه داده استفاده می‌کند.

ساختار مهاجرت

یک کلاس مهاجرت شامل دو روش است: up و down . این up روش برای افزودن جداول، ستون‌ها یا نمایه‌های جدید به پایگاه داده شما استفاده می‌شود، در حالی که down روش باید عملیات انجام شده توسط up متد را معکوس کند.

در هر دوی این روش‌ها، می‌توانید از سازنده طرحواره لاراول برای ایجاد و اصلاح جداول استفاده کنید. برای آشنایی با تمام روش‌های موجود در Schema سازنده، مستندات آن را بررسی کنید . به عنوان مثال، مهاجرت زیر یک flights جدول ایجاد می کند:

<?php
 
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
 
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('flights', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('airline');
$table->timestamps();
});
}
 
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::drop('flights');
}
};

تنظیم اتصال مهاجرت

اگر مهاجرت شما با یک اتصال پایگاه داده غیر از اتصال پایگاه داده پیش فرض برنامه شما در تعامل است، باید $connection ویژگی مهاجرت خود را تنظیم کنید:

/**
* The database connection that should be used by the migration.
*
* @var string
*/
protected $connection = 'pgsql';
 
/**
* Run the migrations.
*/
public function up(): void
{
// ...
}

در حال اجرا مهاجرت

برای اجرای همه مهاجرت های برجسته خود، migrate دستور Artisan را اجرا کنید:

php artisan migrate

اگر می‌خواهید ببینید کدام مهاجرت‌ها تاکنون اجرا شده‌اند، می‌توانید از migrate:status دستور Artisan استفاده کنید:

php artisan migrate:status

اگر می‌خواهید دستورات SQL را ببینید که توسط مهاجرت‌ها بدون اجرای واقعی آن‌ها اجرا می‌شوند، می‌توانید پرچم را --pretend به migrate دستور ارائه کنید:

php artisan migrate --pretend

منزوی کردن اعدام

اگر برنامه خود را در چندین سرور استقرار می‌دهید و به عنوان بخشی از فرآیند استقرار، مهاجرت‌ها را اجرا می‌کنید، احتمالاً نمی‌خواهید دو سرور به طور همزمان پایگاه داده را انتقال دهند. برای جلوگیری از این امر، می توانید isolated هنگام فراخوانی migrate دستور از گزینه استفاده کنید.

هنگامی که این isolated گزینه ارائه شد، لاراول قبل از اجرای مهاجرت های شما، با استفاده از درایور کش برنامه شما یک قفل اتمی دریافت می کند. تمام تلاش های دیگر برای اجرای migrate فرمان در حالی که قفل نگه داشته شده است، اجرا نمی شود. با این حال، دستور همچنان با یک کد وضعیت خروج موفق خارج می شود:

php artisan migrate --isolated

برای استفاده از این ویژگی، برنامه شما باید از memcached , redis , dynamodb , database , file یا array کش به عنوان درایور کش پیش فرض برنامه شما استفاده کند. علاوه بر این، همه سرورها باید با یک سرور حافظه مرکزی یکسان در ارتباط باشند.

اجبار مهاجرت به تولید

برخی از عملیات مهاجرت مخرب هستند، به این معنی که ممکن است باعث از دست دادن اطلاعات شما شوند. به منظور محافظت از شما در برابر اجرای این دستورات در برابر پایگاه داده تولید شما، قبل از اجرای دستورات، از شما خواسته می شود تا تأیید کنید. برای اجبار دستورات برای اجرا بدون اعلان، از --force پرچم استفاده کنید:

php artisan migrate --force

بازگشت به عقب مهاجرت

برای برگرداندن آخرین عملیات انتقال، می توانید از rollback دستور Artisan استفاده کنید. این دستور آخرین «مجموعه» مهاجرت‌ها را برمی‌گرداند که ممکن است شامل چندین فایل مهاجرت باشد:

php artisan migrate:rollback

step شما می توانید تعداد محدودی از مهاجرت ها را با ارائه گزینه ای به دستور برگردانید rollback . به عنوان مثال، دستور زیر پنج مهاجرت آخر را به عقب برمی گرداند:

php artisan migrate:rollback --step=5

batch شما می‌توانید با ارائه گزینه‌ای به فرمان ، یک «مجموعه» خاص از مهاجرت‌ها را به عقب برگردانید rollback ، جایی که این batch گزینه با یک مقدار دسته‌ای در جدول پایگاه داده برنامه شما مطابقت دارد migrations . به عنوان مثال، دستور زیر همه مهاجرت‌ها را در دسته سه برمی‌گرداند:

php artisan migrate:rollback --batch=3

اگر می‌خواهید دستورات SQL را ببینید که توسط مهاجرت‌ها بدون اجرای واقعی آن‌ها اجرا می‌شوند، می‌توانید پرچم را --pretend به migrate:rollback دستور ارائه کنید:

php artisan migrate:rollback --pretend

این migrate:reset دستور همه مهاجرت های برنامه شما را برمی گرداند:

php artisan migrate:reset

بازگشت و مهاجرت با استفاده از یک فرمان

این migrate:refresh دستور تمام مهاجرت های شما را برمی گرداند و سپس migrate دستور را اجرا می کند. این دستور به طور موثر کل پایگاه داده شما را دوباره ایجاد می کند:

php artisan migrate:refresh
 
# Refresh the database and run all database seeds...
php artisan migrate:refresh --seed

step شما می توانید با ارائه گزینه ای به دستور ، تعداد محدودی از مهاجرت ها را به عقب برگردانید و دوباره مهاجرت کنید refresh . به عنوان مثال، دستور زیر به عقب برگردانده می شود و پنج مهاجرت آخر را دوباره منتقل می کند:

php artisan migrate:refresh --step=5

همه جداول را رها کنید و مهاجرت کنید

دستور migrate:fresh تمام جداول را از پایگاه داده حذف می کند و سپس migrate دستور را اجرا می کند:

php artisan migrate:fresh
 
php artisan migrate:fresh --seed

به طور پیش فرض، migrate:fresh دستور فقط جداول را از اتصال پایگاه داده پیش فرض حذف می کند. با این حال، می توانید از --database گزینه ای برای تعیین اتصال پایگاه داده ای که باید منتقل شود استفاده کنید. نام اتصال پایگاه داده باید با اتصال تعریف شده در database فایل پیکربندی برنامه شما مطابقت داشته باشد :

php artisan migrate:fresh --database=admin

این migrate:fresh دستور تمام جداول پایگاه داده را بدون توجه به پیشوند آنها حذف می کند. این دستور باید با احتیاط هنگام توسعه در پایگاه داده ای که با سایر برنامه ها به اشتراک گذاشته شده است استفاده شود.

جداول

ایجاد جداول

برای ایجاد یک جدول پایگاه داده جدید، از create روش روی Schema نما استفاده کنید. متد create دو آرگومان را می پذیرد: اولی نام جدول است، در حالی که دومی یک بسته است که یک Blueprint شی را دریافت می کند که ممکن است برای تعریف جدول جدید استفاده شود:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
 
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email');
$table->timestamps();
});

هنگام ایجاد جدول، می توانید از هر یک از روش های ستون ساز طرحواره برای تعریف ستون های جدول استفاده کنید.

تعیین وجود جدول / ستون

شما می توانید وجود یک جدول، ستون یا شاخص را با استفاده از روش های hasTable ، hasColumn و تعیین کنید hasIndex :

if (Schema::hasTable('users')) {
// The "users" table exists...
}
 
if (Schema::hasColumn('users', 'email')) {
// The "users" table exists and has an "email" column...
}
 
if (Schema::hasIndex('users', ['email'], 'unique')) {
// The "users" table exists and has a unique index on the "email" column...
}

اتصال پایگاه داده و گزینه های جدول

اگر می خواهید یک عملیات طرحواره را روی اتصال پایگاه داده ای که اتصال پیش فرض برنامه شما نیست انجام دهید، از connection روش زیر استفاده کنید:

Schema::connection('sqlite')->create('users', function (Blueprint $table) {
$table->id();
});

علاوه بر این، ممکن است از چند ویژگی و روش دیگر برای تعریف سایر جنبه‌های ایجاد جدول استفاده شود. این engine ویژگی ممکن است برای تعیین موتور ذخیره سازی جدول هنگام استفاده از MySQL استفاده شود:

Schema::create('users', function (Blueprint $table) {
$table->engine('InnoDB');
 
// ...
});

در هنگام استفاده از MySQL می توان از ویژگی charset و collation برای تعیین مجموعه کاراکترها و دسته بندی جدول ایجاد شده استفاده کرد:

Schema::create('users', function (Blueprint $table) {
$table->charset('utf8mb4');
$table->collation('utf8mb4_unicode_ci');
 
// ...
});

این temporary روش ممکن است برای نشان دادن اینکه جدول باید "موقت" باشد استفاده شود. جداول موقت فقط برای جلسه پایگاه داده اتصال فعلی قابل مشاهده هستند و با بسته شدن اتصال به طور خودکار حذف می شوند:

Schema::create('calculations', function (Blueprint $table) {
$table->temporary();
 
// ...
});

اگر می خواهید یک "نظر" را به جدول پایگاه داده اضافه کنید، می توانید متد را comment در نمونه جدول فراخوانی کنید. نظرات جدول در حال حاضر فقط توسط MySQL و PostgreSQL پشتیبانی می شوند:

Schema::create('calculations', function (Blueprint $table) {
$table->comment('Business calculations');
 
// ...
});

به روز رسانی جداول

روش table روی Schema نما ممکن است برای به روز رسانی جداول موجود استفاده شود. مانند create متد، table متد دو آرگومان می‌پذیرد: نام جدول و بسته‌ای که Blueprint نمونه‌ای را دریافت می‌کند که می‌توانید برای افزودن ستون‌ها یا نمایه‌ها به جدول استفاده کنید:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
 
Schema::table('users', function (Blueprint $table) {
$table->integer('votes');
});

تغییر نام / حذف جداول

برای تغییر نام جدول پایگاه داده موجود، از rename روش زیر استفاده کنید:

use Illuminate\Support\Facades\Schema;
 
Schema::rename($from, $to);

برای حذف جدول موجود، می‌توانید از روش‌های drop یا استفاده کنید dropIfExists :

Schema::drop('users');
 
Schema::dropIfExists('users');

تغییر نام جداول با کلیدهای خارجی

قبل از تغییر نام جدول، باید بررسی کنید که هر گونه محدودیت کلید خارجی روی جدول دارای یک نام صریح در فایل های مهاجرت شما باشد به جای اینکه به لاراول اجازه دهید یک نام مبتنی بر قرارداد اختصاص دهد. در غیر این صورت، نام محدودیت کلید خارجی به نام جدول قدیمی اشاره خواهد کرد.

ستون ها

ایجاد ستون ها

روش table روی Schema نما ممکن است برای به روز رسانی جداول موجود استفاده شود. مانند create متد، table متد دو آرگومان را می پذیرد: نام جدول و بسته ای که Illuminate\Database\Schema\Blueprint نمونه ای را دریافت می کند که می توانید از آن برای اضافه کردن ستون به جدول استفاده کنید:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
 
Schema::table('users', function (Blueprint $table) {
$table->integer('votes');
});

انواع ستون های موجود

طرح طرحواره ساز روش های مختلفی را ارائه می دهد که مطابق با انواع مختلف ستون هایی است که می توانید به جداول پایگاه داده خود اضافه کنید. هر یک از روش های موجود در جدول زیر آورده شده است:

bigIncrements()

این bigIncrements روش یک ستون معادل با افزایش خودکار UNSIGNED BIGINT (کلید اصلی) ایجاد می کند:

$table->bigIncrements('id');

bigInteger()

این bigInteger روش یک BIGINT ستون معادل ایجاد می کند:

$table->bigInteger('votes');

binary()

این binary روش یک BLOB ستون معادل ایجاد می کند:

$table->binary('photo');

هنگام استفاده از MySQL، MariaDB، یا SQL Server، می‌توانید برای ایجاد یا ستون معادل آن، آرگومان‌هایی را length ارسال کنید : fixed VARBINARY BINARY

$table->binary('data', length: 16); // VARBINARY(16)
 
$table->binary('data', length: 16, fixed: true); // BINARY(16)

boolean()

این boolean روش یک BOOLEAN ستون معادل ایجاد می کند:

$table->boolean('confirmed');

char()

این char روش یک CHAR ستون معادل با طول معین ایجاد می کند:

$table->char('name', length: 100);

dateTimeTz()

این dateTimeTz روش یک DATETIME ستون معادل (با منطقه زمانی) با دقت کسری از ثانیه اختیاری ایجاد می کند:

$table->dateTimeTz('created_at', precision: 0);

dateTime()

این dateTime روش یک DATETIME ستون معادل با دقت کسری ثانیه اختیاری ایجاد می کند:

$table->dateTime('created_at', precision: 0);

date()

این date روش یک DATE ستون معادل ایجاد می کند:

$table->date('created_at');

decimal()

این decimal روش یک DECIMAL ستون معادل با دقت داده شده (ارقام کل) و مقیاس (اعداد اعشاری) ایجاد می کند:

$table->decimal('amount', total: 8, places: 2);

double()

این double روش یک DOUBLE ستون معادل ایجاد می کند:

$table->double('amount');

enum()

این enum روش یک ENUM ستون معادل با مقادیر معتبر داده شده ایجاد می کند:

$table->enum('difficulty', ['easy', 'hard']);

float()

این float روش یک FLOAT ستون معادل با دقت داده شده ایجاد می کند:

$table->float('amount', precision: 53);

foreignId()

این foreignId روش یک UNSIGNED BIGINT ستون معادل ایجاد می کند:

$table->foreignId('user_id');

foreignIdFor()

این foreignIdFor روش یک {column}_id ستون معادل برای کلاس مدل داده شده اضافه می کند. نوع ستون UNSIGNED BIGINT ، CHAR(36) یا CHAR(26) بسته به نوع کلید مدل خواهد بود:

$table->foreignIdFor(User::class);

foreignUlid()

این foreignUlid روش یک ULID ستون معادل ایجاد می کند:

$table->foreignUlid('user_id');

foreignUuid()

این foreignUuid روش یک UUID ستون معادل ایجاد می کند:

$table->foreignUuid('user_id');

geography()

این geography روش یک GEOGRAPHY ستون معادل با نوع فضایی داده شده و SRID (شناسه سیستم مرجع مکانی) ایجاد می کند:

$table->geography('coordinates', subtype: 'point', srid: 4326);

پشتیبانی از انواع فضایی به درایور پایگاه داده شما بستگی دارد. لطفاً به مستندات پایگاه داده خود مراجعه کنید. اگر برنامه شما از پایگاه داده PostgreSQL استفاده می کند، باید پسوند PostGIS را geography قبل از استفاده از روش نصب کنید.

geometry()

این geometry روش یک GEOMETRY ستون معادل با نوع فضایی داده شده و SRID (شناسه سیستم مرجع مکانی) ایجاد می کند:

$table->geometry('positions', subtype: 'point', srid: 0);

پشتیبانی از انواع فضایی به درایور پایگاه داده شما بستگی دارد. لطفاً به مستندات پایگاه داده خود مراجعه کنید. اگر برنامه شما از پایگاه داده PostgreSQL استفاده می کند، باید پسوند PostGIS را geometry قبل از استفاده از روش نصب کنید.

id()

متد id نام مستعار متد است bigIncrements . به طور پیش فرض، متد یک id ستون ایجاد می کند. با این حال، اگر می‌خواهید نام دیگری به ستون اختصاص دهید، می‌توانید نام ستون را ارسال کنید:

$table->id();

increments()

این increments روش یک ستون معادل با افزایش خودکار UNSIGNED INTEGER به عنوان کلید اصلی ایجاد می کند:

$table->increments('id');

integer()

این integer روش یک INTEGER ستون معادل ایجاد می کند:

$table->integer('votes');

ipAddress()

این ipAddress روش یک VARCHAR ستون معادل ایجاد می کند:

$table->ipAddress('visitor');

هنگام استفاده از PostgreSQL، یک INET ستون ایجاد می شود.

json()

این json روش یک JSON ستون معادل ایجاد می کند:

$table->json('options');

jsonb()

این jsonb روش یک JSONB ستون معادل ایجاد می کند:

$table->jsonb('options');

longText()

این longText روش یک LONGTEXT ستون معادل ایجاد می کند:

$table->longText('description');

هنگامی که از MySQL یا MariaDB استفاده می کنید، می توانید یک binary مجموعه کاراکتر در ستون به منظور ایجاد یک LONGBLOB ستون معادل اعمال کنید:

$table->longText('data')->charset('binary'); // LONGBLOB

macAddress()

این macAddress روش ستونی را ایجاد می کند که برای نگهداری آدرس MAC در نظر گرفته شده است. برخی از سیستم های پایگاه داده، مانند PostgreSQL، یک نوع ستون اختصاصی برای این نوع داده ها دارند. سایر سیستم های پایگاه داده از یک ستون معادل رشته استفاده می کنند:

$table->macAddress('device');

mediumIncrements()

این mediumIncrements روش یک ستون معادل با افزایش خودکار UNSIGNED MEDIUMINT به عنوان کلید اصلی ایجاد می کند:

$table->mediumIncrements('id');

mediumInteger()

این mediumInteger روش یک MEDIUMINT ستون معادل ایجاد می کند:

$table->mediumInteger('votes');

mediumText()

این mediumText روش یک MEDIUMTEXT ستون معادل ایجاد می کند:

$table->mediumText('description');

هنگامی که از MySQL یا MariaDB استفاده می کنید، می توانید یک binary مجموعه کاراکتر در ستون به منظور ایجاد یک MEDIUMBLOB ستون معادل اعمال کنید:

$table->mediumText('data')->charset('binary'); // MEDIUMBLOB

morphs()

این morphs روش یک روش راحت است که یک {column}_id ستون معادل و یک {column}_type VARCHAR ستون معادل اضافه می کند. نوع ستون برای {column}_id خواهد بود UNSIGNED BIGINT ، CHAR(36) یا CHAR(26) بسته به نوع کلید مدل.

این روش در نظر گرفته شده است که هنگام تعریف ستون های لازم برای یک رابطه Eloquent چند شکلی استفاده شود . در مثال زیر، taggable_id ستون taggable_type ها ایجاد می شوند:

$table->morphs('taggable');

nullableTimestamps()

این nullableTimestamps روش نام مستعار روش مهر زمان است :

$table->nullableTimestamps(precision: 0);

nullableMorphs()

روش مشابه روش مورف است . با این حال، ستون هایی که ایجاد می شوند "nullable" خواهند بود:

$table->nullableMorphs('taggable');

nullableUlidMorphs()

روش مشابه روش ulidMorphs است . با این حال، ستون هایی که ایجاد می شوند "nullable" خواهند بود:

$table->nullableUlidMorphs('taggable');

nullableUuidMorphs()

این روش شبیه به روش uuidMorphs است . با این حال، ستون هایی که ایجاد می شوند "nullable" خواهند بود:

$table->nullableUuidMorphs('taggable');

rememberToken()

این rememberToken روش یک ستون تهی و معادل ایجاد می کند که در نظر گرفته شده است تا رمز احراز هویت VARCHAR(100) فعلی "Memember Me" را ذخیره کند :

$table->rememberToken();

set()

این set روش یک SET ستون معادل با لیست داده شده از مقادیر معتبر ایجاد می کند:

$table->set('flavors', ['strawberry', 'vanilla']);

smallIncrements()

این smallIncrements روش یک ستون معادل با افزایش خودکار UNSIGNED SMALLINT به عنوان کلید اصلی ایجاد می کند:

$table->smallIncrements('id');

smallInteger()

این smallInteger روش یک SMALLINT ستون معادل ایجاد می کند:

$table->smallInteger('votes');

softDeletesTz()

این softDeletesTz روش یک deleted_at TIMESTAMP ستون معادل تهی (با منطقه زمانی) با دقت کسری ثانیه اختیاری اضافه می کند. این ستون برای ذخیره deleted_at مهر زمانی مورد نیاز برای عملکرد "حذف نرم" Eloquent در نظر گرفته شده است:

$table->softDeletesTz('deleted_at', precision: 0);

softDeletes()

این softDeletes روش یک deleted_at TIMESTAMP ستون معادل تهی با دقت کسری ثانیه اختیاری اضافه می کند. این ستون برای ذخیره deleted_at مهر زمانی مورد نیاز برای عملکرد "حذف نرم" Eloquent در نظر گرفته شده است:

$table->softDeletes('deleted_at', precision: 0);

string()

این string روش یک VARCHAR ستون معادل با طول داده شده ایجاد می کند:

$table->string('name', length: 100);

text()

این text روش یک TEXT ستون معادل ایجاد می کند:

$table->text('description');

هنگامی که از MySQL یا MariaDB استفاده می کنید، می توانید یک binary مجموعه کاراکتر در ستون به منظور ایجاد یک BLOB ستون معادل اعمال کنید:

$table->text('data')->charset('binary'); // BLOB

timeTz()

این timeTz روش یک TIME ستون معادل (با منطقه زمانی) با دقت کسری از ثانیه اختیاری ایجاد می کند:

$table->timeTz('sunrise', precision: 0);

time()

این time روش یک TIME ستون معادل با دقت کسری ثانیه اختیاری ایجاد می کند:

$table->time('sunrise', precision: 0);

timestampTz()

این timestampTz روش یک TIMESTAMP ستون معادل (با منطقه زمانی) با دقت کسری از ثانیه اختیاری ایجاد می کند:

$table->timestampTz('added_at', precision: 0);

timestamp()

این timestamp روش یک TIMESTAMP ستون معادل با دقت کسری ثانیه اختیاری ایجاد می کند:

$table->timestamp('added_at', precision: 0);

timestampsTz()

این timestampsTz روش ستون‌های معادل created_at و updated_at TIMESTAMP (با منطقه زمانی) را با دقت کسری از ثانیه اختیاری ایجاد می‌کند:

$table->timestampsTz(precision: 0);

timestamps()

این timestamps روش ستون‌های معادل created_at و updated_at TIMESTAMP با دقت کسری اختیاری در ثانیه ایجاد می‌کند:

$table->timestamps(precision: 0);

tinyIncrements()

این tinyIncrements روش یک ستون معادل با افزایش خودکار UNSIGNED TINYINT به عنوان کلید اصلی ایجاد می کند:

$table->tinyIncrements('id');

tinyInteger()

این tinyInteger روش یک TINYINT ستون معادل ایجاد می کند:

$table->tinyInteger('votes');

tinyText()

این tinyText روش یک TINYTEXT ستون معادل ایجاد می کند:

$table->tinyText('notes');

هنگامی که از MySQL یا MariaDB استفاده می کنید، می توانید یک binary مجموعه کاراکتر در ستون به منظور ایجاد یک TINYBLOB ستون معادل اعمال کنید:

$table->tinyText('data')->charset('binary'); // TINYBLOB

unsignedBigInteger()

این unsignedBigInteger روش یک UNSIGNED BIGINT ستون معادل ایجاد می کند:

$table->unsignedBigInteger('votes');

unsignedInteger()

این unsignedInteger روش یک UNSIGNED INTEGER ستون معادل ایجاد می کند:

$table->unsignedInteger('votes');

unsignedMediumInteger()

این unsignedMediumInteger روش یک UNSIGNED MEDIUMINT ستون معادل ایجاد می کند:

$table->unsignedMediumInteger('votes');

unsignedSmallInteger()

این unsignedSmallInteger روش یک UNSIGNED SMALLINT ستون معادل ایجاد می کند:

$table->unsignedSmallInteger('votes');

unsignedTinyInteger()

این unsignedTinyInteger روش یک UNSIGNED TINYINT ستون معادل ایجاد می کند:

$table->unsignedTinyInteger('votes');

ulidMorphs()

این ulidMorphs روش یک روش راحت است که یک {column}_id CHAR(26) ستون معادل و یک {column}_type VARCHAR ستون معادل اضافه می کند.

این روش در نظر گرفته شده است که هنگام تعریف ستون های لازم برای یک رابطه Eloquent چند شکلی که از شناسه های ULID استفاده می کند، استفاده شود. در مثال زیر، taggable_id ستون taggable_type ها ایجاد می شوند:

$table->ulidMorphs('taggable');

uuidMorphs()

این uuidMorphs روش یک روش راحت است که یک {column}_id CHAR(36) ستون معادل و یک {column}_type VARCHAR ستون معادل اضافه می کند.

این روش برای تعریف ستون‌های لازم برای یک رابطه Eloquent چند شکلی که از شناسه‌های UUID استفاده می‌کنند استفاده می‌شود. در مثال زیر، taggable_id ستون taggable_type ها ایجاد می شوند:

$table->uuidMorphs('taggable');

ulid()

این ulid روش یک ULID ستون معادل ایجاد می کند:

$table->ulid('id');

uuid()

این uuid روش یک UUID ستون معادل ایجاد می کند:

$table->uuid('id');

year()

این year روش یک YEAR ستون معادل ایجاد می کند:

$table->year('birth_year');

اصلاح کننده های ستون

علاوه بر انواع ستون‌های ذکر شده در بالا، چندین «تغییرکننده» ستون وجود دارد که می‌توانید هنگام اضافه کردن یک ستون به جدول پایگاه داده استفاده کنید. به عنوان مثال، برای ایجاد "nullable" ستون، می توانید از nullable روش استفاده کنید:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
 
Schema::table('users', function (Blueprint $table) {
$table->string('email')->nullable();
});

جدول زیر شامل تمام اصلاح کننده های ستون موجود است. این لیست شامل اصلاح کننده های شاخص نمی شود :

اصلاح کننده شرح
->after('column') ستون "بعد" ستون دیگری (MySQL) را قرار دهید.
->autoIncrement() ستون های INTEGER را به عنوان افزایش خودکار (کلید اصلی) تنظیم کنید.
->charset('utf8mb4') یک مجموعه کاراکتر برای ستون (MySQL) مشخص کنید.
->collation('utf8mb4_unicode_ci') یک ترکیب بندی برای ستون مشخص کنید.
->comment('my comment') یک نظر به یک ستون اضافه کنید (MySQL / PostgreSQL).
->default($value) یک مقدار "پیش فرض" برای ستون مشخص کنید.
->first() ستون "اول" را در جدول (MySQL) قرار دهید.
->from($integer) مقدار شروع یک فیلد افزایش خودکار (MySQL / PostgreSQL) را تنظیم کنید.
->invisible() ستون را برای SELECT * پرس و جوها "نامرئی" کنید (MySQL).
->nullable($value = true) اجازه دهید مقادیر NULL در ستون درج شود.
->storedAs($expression) یک ستون تولید شده ذخیره شده (MySQL / PostgreSQL / SQLite) ایجاد کنید.
->unsigned() ستون‌های INTEGER را بدون علامت (MySQL) تنظیم کنید.
->useCurrent() ستون های TIMESTAMP را برای استفاده از CURRENT_TIMESTAMP به عنوان مقدار پیش فرض تنظیم کنید.
->useCurrentOnUpdate() ستون‌های TIMESTAMP را طوری تنظیم کنید که از CURRENT_TIMESTAMP هنگام به‌روزرسانی رکورد (MySQL) استفاده کنند.
->virtualAs($expression) یک ستون تولید شده مجازی (MySQL / SQLite) ایجاد کنید.
->generatedAs($expression) یک ستون هویت با گزینه های توالی مشخص شده ایجاد کنید (PostgreSQL).
->always() تقدم مقادیر دنباله را بر ورودی برای ستون هویت (PostgreSQL) تعریف می کند.

عبارات پیش فرض

اصلاح default کننده یک مقدار یا یک Illuminate\Database\Query\Expression نمونه را می پذیرد. استفاده از یک Expression نمونه، لاراول را از قرار دادن مقدار در نقل قول جلوگیری می کند و به شما امکان می دهد از توابع خاص پایگاه داده استفاده کنید. یکی از موقعیت‌هایی که این امر به ویژه مفید است، زمانی است که باید مقادیر پیش‌فرض را به ستون‌های JSON اختصاص دهید:

<?php
 
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Query\Expression;
use Illuminate\Database\Migrations\Migration;
 
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('flights', function (Blueprint $table) {
$table->id();
$table->json('movies')->default(new Expression('(JSON_ARRAY())'));
$table->timestamps();
});
}
};

پشتیبانی از عبارات پیش فرض بستگی به درایور پایگاه داده، نسخه پایگاه داده و نوع فیلد شما دارد. لطفاً به مستندات پایگاه داده خود مراجعه کنید.

ترتیب ستون

هنگام استفاده از پایگاه داده MySQL، این after روش ممکن است برای اضافه کردن ستون ها پس از یک ستون موجود در طرح استفاده شود:

$table->after('password', function (Blueprint $table) {
$table->string('address_line1');
$table->string('address_line2');
$table->string('city');
});

اصلاح ستون ها

این change روش به شما امکان می دهد نوع و ویژگی های ستون های موجود را تغییر دهید. به عنوان مثال، ممکن است بخواهید اندازه یک string ستون را افزایش دهید. برای مشاهده change عملی روش، بیایید اندازه ستون را name از 25 به 50 افزایش دهیم. برای انجام این کار، به سادگی وضعیت جدید ستون را تعریف می کنیم و سپس متد را فراخوانی می کنیم change :

Schema::table('users', function (Blueprint $table) {
$table->string('name', 50)->change();
});

هنگام اصلاح یک ستون، باید به صراحت تمام اصلاح‌کننده‌هایی را که می‌خواهید در تعریف ستون نگه دارید، بگنجانید - هر ویژگی از دست رفته حذف می‌شود. به عنوان مثال، برای حفظ ویژگی های unsigned ، default و comment ، باید هر اصلاح کننده را به طور صریح هنگام تغییر ستون فراخوانی کنید:

Schema::table('users', function (Blueprint $table) {
$table->integer('votes')->unsigned()->default(1)->comment('my comment')->change();
});

این change روش شاخص های ستون را تغییر نمی دهد. بنابراین، می‌توانید از اصلاح‌کننده‌های شاخص برای افزودن یا رها کردن صریح یک نمایه هنگام تغییر ستون استفاده کنید:

// Add an index...
$table->bigIncrements('id')->primary()->change();
 
// Drop an index...
$table->char('postal_code', 10)->unique(false)->change();

تغییر نام ستون ها

برای تغییر نام یک ستون، می توانید از renameColumn روش ارائه شده توسط سازنده طرح استفاده کنید:

Schema::table('users', function (Blueprint $table) {
$table->renameColumn('from', 'to');
});

رها کردن ستون ها

برای رها کردن یک ستون، می توانید dropColumn از روش سازنده طرحواره استفاده کنید:

Schema::table('users', function (Blueprint $table) {
$table->dropColumn('votes');
});

شما می توانید با ارسال آرایه ای از نام ستون ها به dropColumn متد، چندین ستون را از یک جدول رها کنید:

Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['votes', 'avatar', 'location']);
});

نام مستعار فرمان موجود

لاراول چندین روش راحت در رابطه با حذف انواع رایج ستون ها ارائه می دهد. هر یک از این روش ها در جدول زیر توضیح داده شده است:

فرمان شرح
$table->dropMorphs('morphable'); morphable_id ستون های و را رها کنید morphable_type .
$table->dropRememberToken(); remember_token ستون را رها کنید
$table->dropSoftDeletes(); deleted_at ستون را رها کنید
$table->dropSoftDeletesTz(); نام مستعار dropSoftDeletes() روش.
$table->dropTimestamps(); created_at ستون های و را رها کنید updated_at .
$table->dropTimestampsTz(); نام مستعار dropTimestamps() روش.

شاخص ها

ایجاد شاخص ها

سازنده طرحواره لاراول از چندین نوع ایندکس پشتیبانی می کند. مثال زیر یک email ستون جدید ایجاد می کند و مشخص می کند که مقادیر آن باید منحصر به فرد باشد. برای ایجاد ایندکس، می‌توانیم unique متد را به تعریف ستون زنجیر کنیم:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
 
Schema::table('users', function (Blueprint $table) {
$table->string('email')->unique();
});

همچنین، می توانید پس از تعریف ستون، ایندکس را ایجاد کنید. برای انجام این کار، باید unique متد موجود در طرح اولیه سازنده طرحواره را فراخوانی کنید. این روش نام ستونی را می پذیرد که باید یک شاخص منحصر به فرد دریافت کند:

$table->unique('email');

حتی ممکن است آرایه ای از ستون ها را به یک متد شاخص ارسال کنید تا یک شاخص ترکیبی (یا ترکیبی) ایجاد کنید:

$table->index(['account_id', 'created_at']);

هنگام ایجاد یک ایندکس، لاراول به طور خودکار یک نام شاخص را بر اساس جدول، نام ستون ها و نوع شاخص ایجاد می کند، اما می توانید یک آرگومان دوم را به متد ارسال کنید تا خودتان نام ایندکس را مشخص کنید:

$table->unique('email', 'unique_email');

انواع فهرست موجود

کلاس طرح‌واره ساز لاراول روش‌هایی را برای ایجاد هر نوع شاخص پشتیبانی شده توسط لاراول ارائه می‌کند. هر متد ایندکس آرگومان دوم اختیاری را برای تعیین نام ایندکس می پذیرد. در صورت حذف، نام از نام جدول و ستون(های) مورد استفاده برای نمایه و همچنین نوع نمایه مشتق می شود. هر یک از روش های شاخص موجود در جدول زیر توضیح داده شده است:

فرمان شرح
$table->primary('id'); یک کلید اصلی اضافه می کند.
$table->primary(['id', 'parent_id']); کلیدهای ترکیبی را اضافه می کند.
$table->unique('email'); یک شاخص منحصر به فرد اضافه می کند.
$table->index('state'); یک شاخص اضافه می کند.
$table->fullText('body'); یک نمایه متن کامل (MySQL / PostgreSQL) اضافه می کند.
$table->fullText('body')->language('english'); یک نمایه متن کامل از زبان مشخص شده (PostgreSQL) را اضافه می کند.
$table->spatialIndex('location'); یک شاخص فضایی (به جز SQLite) اضافه می کند.

تغییر نام ایندکس ها

برای تغییر نام ایندکس، می‌توانید از renameIndex روش ارائه شده توسط طرحواره ساز استفاده کنید. این متد نام ایندکس فعلی را به عنوان اولین آرگومان خود و نام مورد نظر را به عنوان آرگومان دوم خود می پذیرد:

$table->renameIndex('from', 'to')

کاهش شاخص ها

برای حذف ایندکس، باید نام ایندکس را مشخص کنید. به طور پیش فرض، لاراول به طور خودکار یک نام شاخص را بر اساس نام جدول، نام ستون ایندکس شده و نوع شاخص اختصاص می دهد. در اینجا چند نمونه آورده شده است:

فرمان شرح
$table->dropPrimary('users_id_primary'); یک کلید اصلی را از جدول "کاربران" رها کنید.
$table->dropUnique('users_email_unique'); یک فهرست منحصر به فرد را از جدول "کاربران" رها کنید.
$table->dropIndex('geo_state_index'); یک شاخص اساسی را از جدول "geo" رها کنید.
$table->dropFullText('posts_body_fulltext'); یک فهرست کامل متن را از جدول "پست ها" رها کنید.
$table->dropSpatialIndex('geo_location_spatialindex'); یک شاخص فضایی را از جدول "geo" رها کنید (به جز SQLite).

اگر آرایه ای از ستون ها را به روشی ارسال کنید که ایندکس ها را حذف می کند، نام ایندکس معمولی بر اساس نام جدول، ستون ها و نوع شاخص ایجاد می شود:

Schema::table('geo', function (Blueprint $table) {
$table->dropIndex(['state']); // Drops index 'geo_state_index'
});

محدودیت های کلید خارجی

لاراول همچنین از ایجاد محدودیت های کلید خارجی پشتیبانی می کند، که برای تحمیل یکپارچگی ارجاعی در سطح پایگاه داده استفاده می شود. به عنوان مثال، بیایید user_id ستونی را در posts جدول تعریف کنیم که به id ستون روی users جدول اشاره می کند:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
 
Schema::table('posts', function (Blueprint $table) {
$table->unsignedBigInteger('user_id');
 
$table->foreign('user_id')->references('id')->on('users');
});

از آنجایی که این نحو نسبتاً پرمخاطب است، لاراول روش‌های دیگری را ارائه می‌کند که از قراردادها برای ارائه تجربه بهتر توسعه‌دهنده استفاده می‌کنند. هنگام استفاده از foreignId روش برای ایجاد ستون خود، مثال بالا را می توان به صورت زیر بازنویسی کرد:

Schema::table('posts', function (Blueprint $table) {
$table->foreignId('user_id')->constrained();
});

این foreignId روش یک UNSIGNED BIGINT ستون معادل ایجاد می کند، در حالی که constrained روش از قراردادها برای تعیین جدول و ستون مورد اشاره استفاده می کند. اگر نام جدول شما با قراردادهای لاراول مطابقت ندارد، می توانید آن را به صورت دستی در constrained متد ارائه دهید. علاوه بر این، نامی که باید به شاخص تولید شده اختصاص داده شود نیز ممکن است مشخص شود:

Schema::table('posts', function (Blueprint $table) {
$table->foreignId('user_id')->constrained(
table: 'users', indexName: 'posts_user_id'
);
});

همچنین می‌توانید عمل مورد نظر را برای ویژگی‌های «در حذف» و «در به‌روزرسانی» محدودیت مشخص کنید:

$table->foreignId('user_id')
->constrained()
->onUpdate('cascade')
->onDelete('cascade');

یک نحو بیانگر جایگزین نیز برای این اقدامات ارائه شده است:

روش شرح
$table->cascadeOnUpdate(); به روز رسانی ها باید آبشاری شوند.
$table->restrictOnUpdate(); به روز رسانی باید محدود شود.
$table->noActionOnUpdate(); هیچ اقدامی در مورد به روز رسانی ها انجام نمی شود.
$table->cascadeOnDelete(); حذف ها باید آبشاری شوند.
$table->restrictOnDelete(); حذف ها باید محدود شوند.
$table->nullOnDelete(); Deletes باید مقدار کلید خارجی را روی null تنظیم کند.

هر تغییر دهنده ستون اضافی باید قبل از متد فراخوانی شود constrained :

$table->foreignId('user_id')
->nullable()
->constrained();

انداختن کلیدهای خارجی

برای حذف یک کلید خارجی، می توانید از dropForeign روش استفاده کنید و نام محدودیت کلید خارجی را به عنوان آرگومان حذف کنید. محدودیت های کلید خارجی از همان قرارداد نامگذاری به عنوان شاخص استفاده می کنند. به عبارت دیگر، نام محدودیت کلید خارجی بر اساس نام جدول و ستون های موجود در محدودیت و پسوند "_foreign" است:

$table->dropForeign('posts_user_id_foreign');

همچنین، می‌توانید آرایه‌ای حاوی نام ستون را که کلید خارجی را در خود نگه می‌دارد به dropForeign روش ارسال کنید. آرایه با استفاده از قراردادهای نامگذاری محدودیت لاراول به یک نام محدودیت کلید خارجی تبدیل می شود:

$table->dropForeign(['user_id']);

جابجایی محدودیت های کلید خارجی

با استفاده از روش‌های زیر می‌توانید محدودیت‌های کلید خارجی را در مهاجرت‌های خود فعال یا غیرفعال کنید:

Schema::enableForeignKeyConstraints();
 
Schema::disableForeignKeyConstraints();
 
Schema::withoutForeignKeyConstraints(function () {
// Constraints disabled within this closure...
});

SQLite به طور پیش فرض محدودیت های کلید خارجی را غیرفعال می کند. هنگام استفاده از SQLite، مطمئن شوید که پشتیبانی از کلیدهای خارجی را در پیکربندی پایگاه داده خود فعال کرده اید، قبل از اینکه بخواهید آنها را در مهاجرت خود ایجاد کنید. علاوه بر این، SQLite فقط از کلیدهای خارجی پس از ایجاد جدول پشتیبانی می کند و نه زمانی که جداول تغییر می کنند .

مناسبت ها

برای راحتی، هر عملیات مهاجرت یک رویداد را ارسال می کند . همه رویدادهای زیر Illuminate\Database\Events\MigrationEvent کلاس پایه را گسترش می دهند:

کلاس شرح
Illuminate\Database\Events\MigrationsStarted دسته ای از مهاجرت ها در شرف اجرا هستند.
Illuminate\Database\Events\MigrationsEnded اجرای دسته ای از مهاجرت ها به پایان رسیده است.
Illuminate\Database\Events\MigrationStarted یک مهاجرت واحد در شرف اجراست.
Illuminate\Database\Events\MigrationEnded اجرای یک انتقال به پایان رسیده است.
Illuminate\Database\Events\SchemaDumped تخلیه طرح پایگاه داده تکمیل شد.
Illuminate\Database\Events\SchemaLoaded یک طرح تخلیه پایگاه داده موجود بارگیری شده است.