پایگاه داده: مهاجرت
معرفی
مهاجرت ها مانند کنترل نسخه برای پایگاه داده شما هستند که به تیم شما اجازه می دهد تا طرح پایگاه داده برنامه را تغییر داده و به اشتراک بگذارد. مهاجرت ها معمولاً با سازنده طرحواره لاراول جفت می شوند تا طرحواره پایگاه داده اپلیکیشن شما ساخته شود. اگر تا به حال مجبور شده اید به یک هم تیمی بگویید که به صورت دستی یک ستون را به طرح پایگاه داده محلی خود اضافه کند، با مشکلی روبرو شده اید که مهاجرت پایگاه داده حل می کند.
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 فقط از کلیدهای خارجی پس از ایجاد جدول پشتیبانی می کند و نه زمانی که جداول تغییر می کنند .