نسخه:

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

معرفی

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

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

ایجاد مهاجرت

برای ایجاد یک مهاجرت، از make:migration دستور Artisan استفاده کنید :

php artisan make:migration create_users_table

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

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

گزینه های --table و --create همچنین ممکن است برای نشان دادن نام جدول و اینکه آیا مهاجرت یک جدول جدید ایجاد می کند یا نه استفاده شود. این گزینه ها فایل خرد مهاجرت ایجاد شده را با جدول مشخص شده از قبل پر می کنند:

php artisan make:migration create_users_table --create=users
 
php artisan make:migration add_votes_to_users_table --table=users

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

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

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

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

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

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

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

php artisan migrate

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

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

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

php artisan migrate --force

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

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

php artisan migrate:rollback

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

php artisan migrate:rollback --step=5

این 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

جداول

ایجاد جداول

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

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

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

بررسی وجود جدول / ستون

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

if (Schema::hasTable('users')) {
//
}
 
if (Schema::hasColumn('users', 'email')) {
//
}

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

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

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

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

فرمان شرح
$table->engine = 'InnoDB'; موتور ذخیره سازی جدول (MySQL) را مشخص کنید.
$table->charset = 'utf8mb4'; یک مجموعه کاراکتر پیش فرض برای جدول (MySQL) مشخص کنید.
$table->collation = 'utf8mb4_unicode_ci'; یک ترکیب پیش فرض برای جدول (MySQL) مشخص کنید.
$table->temporary(); یک جدول موقت (به جز SQL Server) ایجاد کنید.

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

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

Schema::rename($from, $to);

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

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

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

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

ستون ها

ایجاد ستون ها

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

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

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

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

فرمان شرح
$table->id(); نام مستعار از $table->bigIncrements('id') .
$table->foreignId('user_id'); نام مستعار از $table->unsignedBigInteger('user_id') .
$table->bigIncrements('id'); افزایش خودکار ستون معادل BIGINT بدون علامت (کلید اصلی).
$table->bigInteger('votes'); ستون معادل BIGINT.
$table->binary('data'); ستون معادل BLOB.
$table->boolean('confirmed'); ستون معادل BOOLEAN.
$table->char('name', 100); ستون معادل CHAR با طول.
$table->date('created_at'); ستون معادل DATE.
$table->dateTime('created_at', 0); ستون معادل DATETIME با دقت (ارقام کل).
$table->dateTimeTz('created_at', 0); DATETIME (با منطقه زمانی) ستون معادل با دقت (ارقام کل).
$table->decimal('amount', 8, 2); ستون معادل اعشاری با دقت (ارقام کل) و مقیاس (اعداد اعشاری).
$table->double('amount', 8, 2); ستون معادل دو برابر با دقت (ارقام کل) و مقیاس (اعداد اعشاری).
$table->enum('level', ['easy', 'hard']); ستون معادل ENUM.
$table->float('amount', 8, 2); ستون معادل FLOAT با دقت (ارقام کل) و مقیاس (اعداد اعشاری).
$table->geometry('positions'); ستون معادل هندسه.
$table->geometryCollection('positions'); ستون معادل GEOMETRYCOLLECTION.
$table->increments('id'); افزایش خودکار ستون معادل بدون علامت صحیح (کلید اصلی).
$table->integer('votes'); ستون معادل INTEGER.
$table->ipAddress('visitor'); ستون معادل آدرس IP.
$table->json('options'); ستون معادل JSON.
$table->jsonb('options'); ستون معادل JSONB.
$table->lineString('positions'); ستون معادل LINESTRING.
$table->longText('description'); ستون معادل LONGTEXT.
$table->macAddress('device'); ستون معادل آدرس MAC.
$table->mediumIncrements('id'); افزایش خودکار ستون معادل UNSIGNED MEDIUMINT (کلید اصلی).
$table->mediumInteger('votes'); ستون معادل MEDIUMINT.
$table->mediumText('description'); ستون معادل MEDIOMTEXT.
$table->morphs('taggable'); ستون‌های معادل taggable_id BIGINT و VARCHAR بدون علامت را اضافه می‌کند . taggable_type
$table->uuidMorphs('taggable'); taggable_id ستون های معادل CHAR(36) و taggable_type VARCHAR(255) UUID را اضافه می کند .
$table->multiLineString('positions'); ستون معادل MULTILINESTRING.
$table->multiPoint('positions'); ستون معادل MULTIPOINT.
$table->multiPolygon('positions'); ستون معادل MULTIPOLYGON.
$table->nullableMorphs('taggable'); نسخه های nullable morphs() ستون ها را اضافه می کند.
$table->nullableUuidMorphs('taggable'); نسخه های nullable uuidMorphs() ستون ها را اضافه می کند.
$table->nullableTimestamps(0); نام مستعار timestamps() روش.
$table->point('position'); ستون معادل POINT.
$table->polygon('positions'); ستون معادل POLYGON.
$table->rememberToken(); remember_token یک ستون معادل VARCHAR(100) nullable اضافه می کند .
$table->set('flavors', ['strawberry', 'vanilla']); ستون معادل را تنظیم کنید.
$table->smallIncrements('id'); افزایش خودکار ستون معادل SMALLINT بدون علامت (کلید اصلی).
$table->smallInteger('votes'); ستون معادل SMALLINT.
$table->softDeletes('deleted_at', 0); یک deleted_at ستون معادل TIMESTAMP قابل تهی برای حذف های نرم با دقت (ارقام کل) اضافه می کند.
$table->softDeletesTz('deleted_at', 0); یک deleted_at ستون معادل TIMESTAMP (با منطقه زمانی) تهی برای حذف های نرم با دقت (ارقام کل) اضافه می کند.
$table->string('name', 100); ستون معادل VARCHAR با طول.
$table->text('description'); ستون معادل TEXT.
$table->time('sunrise', 0); ستون معادل TIME با دقت (ارقام کل).
$table->timeTz('sunrise', 0); TIME (با منطقه زمانی) ستون معادل با دقت (ارقام کل).
$table->timestamp('added_on', 0); ستون معادل TIMESTAMP با دقت (ارقام کل).
$table->timestampTz('added_on', 0); TIMESTAMP (با منطقه زمانی) ستون معادل با دقت (ارقام کل).
$table->timestamps(0); ستون های تهی created_at و updated_at معادل TIMESTAMP را با دقت (ارقام کل) اضافه می کند.
$table->timestampsTz(0); ستون‌های معادل nullable created_at و updated_at TIMESTAMP (با منطقه زمانی) را با دقت (ارقام کل) اضافه می‌کند.
$table->tinyIncrements('id'); افزایش خودکار ستون معادل بدون علامت TINYINT (کلید اصلی).
$table->tinyInteger('votes'); ستون معادل TINYINT.
$table->unsignedBigInteger('votes'); ستون معادل BIGINT بدون علامت.
$table->unsignedDecimal('amount', 8, 2); ستون معادل اعشاری بدون علامت با دقت (ارقام کل) و مقیاس (اعداد اعشاری).
$table->unsignedInteger('votes'); ستون معادل بدون علامت صحیح.
$table->unsignedMediumInteger('votes'); ستون معادل UNSIGNED MEDIUMINT.
$table->unsignedSmallInteger('votes'); ستون معادل SMALLINT بدون علامت.
$table->unsignedTinyInteger('votes'); ستون معادل TINYINT بدون امضا.
$table->uuid('id'); ستون معادل UUID.
$table->year('birth_year'); ستون معادل YEAR.

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

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

Schema::table('users', function (Blueprint $table) {
$table->string('email')->nullable();
});

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

اصلاح کننده شرح
->after('column') ستون را "بعد" ستون دیگری (MySQL) قرار دهید
->autoIncrement() تنظیم ستون های INTEGER به عنوان افزایش خودکار (کلید اصلی)
->charset('utf8mb4') یک مجموعه کاراکتر برای ستون مشخص کنید (MySQL)
->collation('utf8mb4_unicode_ci') یک ترکیب بندی برای ستون مشخص کنید (MySQL/PostgreSQL/SQL Server)
->comment('my comment') اضافه کردن نظر به یک ستون (MySQL/PostgreSQL)
->default($value) یک مقدار "پیش فرض" برای ستون مشخص کنید
->first() ستون "اول" را در جدول قرار دهید (MySQL)
->nullable($value = true) اجازه می دهد (به طور پیش فرض) مقادیر NULL در ستون درج شود
->storedAs($expression) ایجاد یک ستون تولید شده ذخیره شده (MySQL)
->unsigned() ستون‌های INTEGER را به‌عنوان بدون علامت (MySQL) تنظیم کنید
->useCurrent() ستون های TIMESTAMP را برای استفاده از CURRENT_TIMESTAMP به عنوان مقدار پیش فرض تنظیم کنید
->virtualAs($expression) ایجاد یک ستون مجازی تولید شده (MySQL)
->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;
 
class CreateFlightsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('flights', function (Blueprint $table) {
$table->id();
$table->json('movies')->default(new Expression('(JSON_ARRAY())'));
$table->timestamps();
});
}
}

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

اصلاح ستون ها

پیش نیازها

قبل از اصلاح یک ستون، حتماً doctrine/dbal وابستگی را به فایل خود اضافه کنید composer.json . کتابخانه Doctrine DBAL برای تعیین وضعیت فعلی ستون و ایجاد پرس و جوهای SQL مورد نیاز برای انجام تنظیمات مورد نیاز استفاده می شود:

composer require doctrine/dbal

به روز رسانی ویژگی های ستون

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

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

همچنین می‌توانیم یک ستون را تغییر دهیم تا nullable باشد:

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

فقط انواع ستون های زیر را می توان "تغییر" کرد: bigInteger، باینری، بولی، تاریخ، dateTime، dateTimeTz، اعشاری، عدد صحیح، json، longText، mediumText، smallInteger، رشته، متن، زمان، بدون علامتBigInteger، unsignedInteger، unsignedSmallInteger و unsignedSmallInteger

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

برای تغییر نام یک ستون، می‌توانید renameColumn از روش سازنده طرحواره استفاده کنید. قبل از تغییر نام یک ستون، حتماً doctrine/dbal وابستگی را به فایل خود اضافه کنید composer.json :

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

تغییر نام هر ستون در جدولی که دارای یک نوع ستون باشد enum در حال حاضر پشتیبانی نمی شود.

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

برای رها کردن یک ستون، dropColumn از روش سازنده طرحواره استفاده کنید. قبل از رها کردن ستون ها از پایگاه داده SQLite، باید doctrine/dbal وابستگی را به composer.json فایل خود اضافه کنید و composer update دستور را در ترمینال خود برای نصب کتابخانه اجرا کنید:

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

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

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

حذف یا تغییر چندین ستون در یک انتقال واحد در حین استفاده از پایگاه داده SQLite پشتیبانی نمی شود.

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

فرمان شرح
$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 متد را به تعریف ستون زنجیر کنیم:

$table->string('email')->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->spatialIndex('location'); یک شاخص فضایی اضافه می کند. (به جز SQLite)

طول فهرست و MySQL / MariaDB

لاراول utf8mb4 به طور پیش فرض از مجموعه کاراکترها استفاده می کند که شامل پشتیبانی از ذخیره «ایموجی» در پایگاه داده می شود. اگر نسخه‌ای از MySQL قدیمی‌تر از نسخه 5.7.7 یا MariaDB قدیمی‌تر از نسخه 10.2.2 را اجرا می‌کنید، ممکن است لازم باشد طول رشته پیش‌فرض ایجاد شده توسط مهاجرت‌ها را به صورت دستی پیکربندی کنید تا MySQL برای آنها فهرست ایجاد کند. شما می توانید این را با فراخوانی Schema::defaultStringLength متد داخل خود پیکربندی کنید AppServiceProvider :

use Illuminate\Support\Facades\Schema;
 
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
}

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

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

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

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

کاهش شاخص ها

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

فرمان شرح
$table->dropPrimary('users_id_primary'); یک کلید اصلی را از جدول "کاربران" رها کنید.
$table->dropUnique('users_email_unique'); یک فهرست منحصر به فرد را از جدول "کاربران" رها کنید.
$table->dropIndex('geo_state_index'); یک شاخص اساسی را از جدول "geo" رها کنید.
$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 جدول اشاره می کند:

Schema::table('posts', function (Blueprint $table) {
$table->unsignedBigInteger('user_id');
 
$table->foreign('user_id')->references('id')->on('users');
});

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

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

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

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

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

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

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

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

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

$table->dropForeign('posts_user_id_foreign');

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

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

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

Schema::enableForeignKeyConstraints();
 
Schema::disableForeignKeyConstraints();

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