پایگاه داده: مهاجرت
معرفی
مهاجرت ها مانند کنترل نسخه برای پایگاه داده شما هستند که به تیم شما اجازه می دهد تا تعریف طرحواره پایگاه داده برنامه را تعریف و به اشتراک بگذارد. اگر تا به حال مجبور شده اید به یک هم تیمی بگویید که پس از اعمال تغییرات خود از کنترل منبع، به صورت دستی ستونی را به طرح پایگاه داده محلی خود اضافه کند، با مشکلی روبرو شده اید که انتقال پایگاه داده حل می کند.
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:dumpphp 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');});
انواع ستون های موجود
طرح طرحواره ساز روش های مختلفی را ارائه می دهد که مطابق با انواع مختلف ستون هایی است که می توانید به جداول پایگاه داده خود اضافه کنید. هر یک از روش های موجود در جدول زیر آورده شده است:
افزایش های بزرگ bigInteger دودویی بولی کاراکتر dateTimeTz زمان قرار تاریخ اعشاری دو برابر enum شناور شناسه خارجی ForeignIdFor خارجیUlid خارجیUuid جغرافیا هندسه شناسه افزایش عدد صحیح آدرس آی پی json jsonb متن طولانی مک آدرس افزایش متوسط متوسط عدد صحیح متن متوسط شکل ها nullableMorphs nullableTimestamps nullableUlidMorphs nullableUuidMorphs memoryToken تنظیم افزایش های کوچک کوچک صحیح softDeletesTz softDeletes رشته متن timeTz زمان timestampTz مهر زمانی مهرهای زمانیTz مهر زمانی افزایش های کوچک tinyInteger tinyText بدون علامت BigInteger عدد صحیح بدون علامت بدون علامتMediumInteger بدون علامتSmallInteger TinyInteger بدون علامت ulidMorphs uuidMorphs ulid uuid سال
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 |
یک طرح تخلیه پایگاه داده موجود بارگیری شده است. |