<? phpukraine ДОКУМЕНТАЦІЯ
Пошук по платформі
Документація українською

Переклад офіційної документації українською. Кожен розділ показує стан готовності: недоперекладене позначене відкрито, а не приховане.

ВЕРСІЯ
АКТУАЛЬНА Актуальний реліз. Переклад наздоганяє оригінал, розділи з низьким відсотком позначені у змісті.
БАЗА ДАНИХ · ЧАСТКОВО частковий переклад, оновлено 15 вересня 2026

Міграції · Laravel

ПЕРЕКЛАД НЕПОВНИЙ

Частину підрозділів ще не перекладено, вони показані англійською нижче в тексті або лишились в оригіналі. Готові фрагменти вже перевірені редактором.

Міграції - це щось схоже на систему контролю версій для вашої бази даних: вони дають команді змогу описати й розділяти між собою схему БД застосунку. Якщо вам колись доводилося просити колегу вручну додати колонку до локальної схеми після того, як він забрав ваші зміни з репозиторію, ви вже стикалися з проблемою, яку розв'язують міграції.

Фасад Schema в Laravel дає незалежну від конкретної БД підтримку створення та зміни таблиць у всіх системах баз даних, які підтримує Laravel. Зазвичай міграції користуються саме цим фасадом, щоб створювати й змінювати таблиці та колонки.

Генерація міграцій

Щоб згенерувати міграцію, скористайтеся Artisan-командою make:migration. Нова міграція потрапить у теку database/migrations. Кожне ім'я файлу міграції містить часову позначку, за якою Laravel визначає порядок міграцій:

php artisan make:migration create_flights_table

За іменем міграції Laravel намагається вгадати ім'я таблиці і те, чи міграція створює нову таблицю. Якщо ім'я таблиці вдалося визначити з імені міграції, Laravel заздалегідь підставить цю таблицю у згенерований файл. Інакше таблицю просто вказують у файлі міграції вручну.

Якщо потрібно задати власний шлях для згенерованої міграції, використайте опцію --path під час виклику команди make:migration. Вказаний шлях має бути відносним щодо базового шляху застосунку.

[!NOTE] Заготовки (stubs) міграцій можна змінювати через публікацію заготовок.

Стискання міграцій

Поки застосунок розвивається, міграцій накопичується все більше. Тека database/migrations може розростися до сотень файлів. За бажанням міграції можна «стиснути» (squash) в один SQL-файл. Для початку виконайте команду schema:dump:

php artisan schema:dump

# Зробити дамп поточної схеми БД і видалити всі наявні міграції...
php artisan schema:dump --prune

Під час виконання цієї команди Laravel запише файл «схеми» в теку database/schema вашого застосунку. Ім'я файлу схеми відповідатиме з'єднанню з базою даних. Тепер, коли ви спробуєте виконати міграції і жодна інша міграція ще не була виконана, Laravel спершу виконає SQL-інструкції з файлу схеми для того з'єднання, яке ви використовуєте. Після цього Laravel виконає всі решту міграцій, які не входили в дамп схеми.

Якщо тести застосунку використовують інше з'єднання з БД, ніж те, з яким ви зазвичай працюєте локально, переконайтеся, що зробили дамп схеми і для нього, щоб тести могли побудувати вашу базу. Зручно робити це після дампу того з'єднання, яким ви зазвичай користуєтеся під час локальної розробки:

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

Файл схеми БД варто закомітити в систему контролю версій, щоб нові розробники в команді могли швидко створити початкову структуру бази вашого застосунку.

[!WARNING] Стискання міграцій доступне лише для MariaDB, MySQL, PostgreSQL і SQLite та використовує клієнт командного рядка відповідної БД.

Структура міграції

Клас міграції містить два методи: up і down. Метод up додає до бази нові таблиці, колонки чи індекси, а метод down має скасовувати те, що зробив up.

В обох цих методах доступний конструктор схеми (schema builder) Laravel, яким виразно створюють і змінюють таблиці. Про всі методи конструктора Schema читайте в його документації. Наприклад, наступна міграція створює таблицю flights:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Виконати міграції.
     */
    public function up(): void
    {
        Schema::create('flights', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('airline');
            $table->timestamps();
        });
    }

    /**
     * Скасувати міграції.
     */
    public function down(): void
    {
        Schema::drop('flights');
    }
};

Задання з'єднання для міграції

Якщо міграція працюватиме не з типовим з'єднанням застосунку, а з іншим, задайте властивість $connection міграції:

/**
 * З'єднання з базою даних, яке має використовувати міграція.
 *
 * @var string
 */
protected $connection = 'pgsql';

/**
 * Виконати міграції.
 */
public function up(): void
{
    // ...
}

Пропуск міграцій

Іноді міграція призначена для функціональності, яка ще не активна, і запускати її поки не потрібно. У такому разі на міграції можна визначити метод shouldRun. Якщо shouldRun повертає false, міграцію буде пропущено:

use App\Models\Flight;
use Laravel\Pennant\Feature;

/**
 * Визначити, чи має ця міграція виконуватися.
 */
public function shouldRun(): bool
{
    return Feature::active(Flight::class);
}

Виконання міграцій

Щоб виконати всі невиконані міграції, запустіть Artisan-команду migrate:

php artisan migrate

Якщо хочете побачити, які міграції вже виконано, а які ще очікують, скористайтеся Artisan-командою migrate:status:

php artisan migrate:status

Якщо передати команді migrate опцію --step, кожна міграція виконається окремою «пачкою» (batch), і згодом ви зможете відкочувати окремі міграції командою migrate:rollback:

php artisan migrate --step

Якщо хочете побачити SQL-інструкції, які виконають міграції, без їхнього фактичного запуску, передайте команді migrate прапорець --pretend:

php artisan migrate --pretend

Ізоляція виконання міграцій

Якщо ви розгортаєте застосунок на кількох серверах і запускаєте міграції як частину процесу деплою, вам, найімовірніше, не потрібно, щоб два сервери одночасно намагалися міграціювати базу. Щоб цього не сталося, використайте опцію isolated під час виклику команди migrate.

Коли передано опцію isolated, Laravel перед запуском міграцій отримає атомарне блокування через драйвер кешу вашого застосунку. Усі інші спроби виконати команду migrate, поки блокування тримається, не виконуватимуться; при цьому команда все одно завершиться з успішним кодом виходу:

php artisan migrate --isolated

[!WARNING] Щоб скористатися цією можливістю, ваш застосунок мусить використовувати як типовий драйвер кешу memcached, redis, dynamodb, database, file або array. Крім того, всі сервери мають працювати з одним центральним кеш-сервером.

Примусове виконання міграцій у продакшені

Деякі операції міграцій деструктивні, тобто можуть призвести до втрати даних. Щоб захистити вас від запуску таких команд на продакшен-базі, перед виконанням буде запитано підтвердження. Щоб виконати команди без запиту, використайте прапорець --force:

php artisan migrate --force

Відкат міграцій

Щоб відкотити останню операцію міграції, скористайтеся Artisan-командою rollback. Ця команда відкочує останню «пачку» міграцій, яка може містити кілька файлів міграцій:

php artisan migrate:rollback

Відкотити обмежену кількість міграцій можна, передавши команді rollback опцію step. Наприклад, наступна команда відкотить п'ять останніх міграцій:

php artisan migrate:rollback --step=5

Можна відкотити конкретну «пачку» міграцій, передавши команді rollback опцію batch, де batch відповідає значенню пачки в таблиці migrations вашої бази даних. Наприклад, наступна команда відкотить усі міграції з пачки номер три:

php artisan migrate:rollback --batch=3

Якщо хочете побачити SQL-інструкції, які виконають міграції, без їхнього фактичного запуску, передайте команді migrate:rollback прапорець --pretend:

php artisan migrate:rollback --pretend

Команда migrate:reset відкотить усі міграції застосунку:

php artisan migrate:reset

Відкат і міграція однією командою

Команда migrate:refresh відкотить усі ваші міграції, а потім виконає команду migrate. Фактично вона заново створює всю вашу базу даних:

php artisan migrate:refresh

# Оновити базу і виконати всі сідери...
php artisan migrate:refresh --seed

Відкотити й повторно виконати обмежену кількість міграцій можна, передавши команді refresh опцію step. Наприклад, наступна команда відкотить і заново виконає п'ять останніх міграцій:

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

[!WARNING] Команда 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')) {
    // Таблиця "users" існує...
}

if (Schema::hasColumn('users', 'email')) {
    // Таблиця "users" існує і має колонку "email"...
}

if (Schema::hasIndex('users', ['email'], 'unique')) {
    // Таблиця "users" існує і має унікальний індекс на колонці "email"...
}

З'єднання з базою даних і опції таблиці

Якщо потрібно виконати операцію зі схемою на з'єднанні, яке не є типовим для застосунку, використайте метод connection:

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

Крім того, кілька інших властивостей і методів описують інші аспекти створення таблиці. Властивість engine задає рушій зберігання таблиці, якщо ви працюєте з MariaDB або MySQL:

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

    // ...
});

Властивості charset і collation задають набір символів і порівняння (collation) створюваної таблиці в MariaDB або MySQL:

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

    // ...
});

Метод temporary позначає таблицю як «тимчасову». Тимчасові таблиці видно лише в сесії бази даних поточного з'єднання, і вони автоматично видаляються після закриття з'єднання:

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

    // ...
});

Якщо хочете додати до таблиці «комментар», викличте метод comment на екземплярі таблиці. Комментарі до таблиць зараз підтримують лише MariaDB, 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');

Перейменування таблиць із зовнішніми ключами

Перед перейменуванням таблиці переконайтеся, що всі обмеження зовнішніх ключів на ній мають у файлах міграцій явне ім'я, а не покладаються на згенероване Laravel за угодою. Інакше ім'я обмеження зовнішнього ключа посилатиметься на старе ім'я таблиці.

Колонки

Створення колонок

Метод 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');
});

Доступні типи колонок

Blueprint конструктора схеми пропонує безліч методів, які відповідають різним типам колонок, що їх можна додати до таблиць бази даних. Усі доступні методи перелічено в таблиці нижче:

Логічні типи

boolean

Рядкові й текстові типи

char longText mediumText string text tinyText

Числові типи

bigIncrements bigInteger decimal double float id increments integer mediumIncrements mediumInteger smallIncrements smallInteger tinyIncrements tinyInteger unsignedBigInteger unsignedInteger unsignedMediumInteger unsignedSmallInteger unsignedTinyInteger

Типи дати й часу

dateTime dateTimeTz date time timeTz timestamp timestamps timestampsTz softDeletes softDeletesTz year

Бінарні типи

binary

Об'єктні та JSON-типи

json jsonb

Типи UUID і ULID

ulid ulidMorphs uuid uuidMorphs nullableUlidMorphs nullableUuidMorphs

Просторові типи

geography geometry

Типи для зв'язків

foreignId foreignIdFor foreignUlid foreignUuid foreignUuidFor morphs nullableMorphs

Спеціальні типи

enum set macAddress ipAddress rememberToken vector

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']);

Замість того, щоб описувати масив допустимих значень руками, можна скористатися методом Enum::cases():

use App\Enums\Difficulty;

$table->enum('difficulty', Difficulty::cases());

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');

foreignUuidFor()

Метод foreignUuidFor додає для заданого класу моделі колонку {column}_id, еквівалентну UUID:

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

geography()

Метод geography створює колонку, еквівалентну GEOGRAPHY, із заданим просторовим типом і SRID (Spatial Reference System Identifier):

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

[!NOTE] Підтримка просторових типів залежить від драйвера вашої БД. Звіряйтеся з документацією своєї бази даних. Якщо застосунок працює з PostgreSQL, перед використанням методу geography потрібно встановити розширення PostGIS.

geometry()

Метод geometry створює колонку, еквівалентну GEOMETRY, із заданим просторовим типом і SRID (Spatial Reference System Identifier):

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

[!NOTE] Підтримка просторових типів залежить від драйвера вашої БД. Звіряйтеся з документацією своєї бази даних. Якщо застосунок працює з PostgreSQL, перед використанням методу geometry потрібно встановити розширення PostGIS.

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');

У SQLite буде створено колонку TEXT.

jsonb()

Метод jsonb створює колонку, еквівалентну JSONB:

$table->jsonb('options');

У SQLite буде створено колонку TEXT.

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}_type, еквівалентну VARCHAR, і колонку {column}_id. Тип колонки {column}_id буде UNSIGNED BIGINT, CHAR(36) або CHAR(26) залежно від типу ключа моделі.

Цей метод призначений для опису колонок, потрібних для поліморфного зв'язку Eloquent. У наступному прикладі буде створено колонки taggable_type і taggable_id:

$table->morphs('taggable');

nullableMorphs()

Метод схожий на morphs, але створені колонки допускатимуть NULL:

$table->nullableMorphs('taggable');

nullableUlidMorphs()

Метод схожий на ulidMorphs, але створені колонки допускатимуть NULL:

$table->nullableUlidMorphs('taggable');

nullableUuidMorphs()

Метод схожий на uuidMorphs, але створені колонки допускатимуть NULL:

$table->nullableUuidMorphs('taggable');

rememberToken()

Метод rememberToken створює nullable-колонку, еквівалентну VARCHAR(100), призначену для зберігання поточного токена автентифікації «запам'ятати мене»:

$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 додає nullable-колонку deleted_at, еквівалентну TIMESTAMP (з часовою зоною), з необов'язковою точністю дробової частини секунд. Ця колонка призначена для зберігання часової позначки deleted_at, потрібної для «м'якого видалення» в Eloquent:

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

softDeletes()

Метод softDeletes додає nullable-колонку 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}_type, еквівалентну VARCHAR, і колонку {column}_id, еквівалентну CHAR(26).

Цей метод призначений для опису колонок, потрібних для поліморфного зв'язку Eloquent, який використовує ідентифікатори ULID. У наступному прикладі буде створено колонки taggable_type і taggable_id:

$table->ulidMorphs('taggable');

uuidMorphs()

Метод uuidMorphs - зручний спосіб додати одразу колонку {column}_type, еквівалентну VARCHAR, і колонку {column}_id, еквівалентну CHAR(36).

Цей метод призначений для опису колонок, потрібних для поліморфного зв'язку Eloquent, який використовує ідентифікатори UUID. У наступному прикладі буде створено колонки taggable_type і taggable_id:

$table->uuidMorphs('taggable');

ulid()

Метод ulid створює колонку, еквівалентну ULID:

$table->ulid('id');

uuid()

Метод uuid створює колонку, еквівалентну UUID:

$table->uuid('id');

vector()

Метод vector створює колонку, еквівалентну vector:

$table->vector('embedding', dimensions: 100);

У PostgreSQL перед створенням колонок vector має бути завантажене розширення pgvector:

Schema::ensureVectorExtensionExists();

year()

Метод year створює колонку, еквівалентну YEAR:

$table->year('birth_year');

Модифікатори колонок

Крім перелічених вище типів колонок, під час додавання колонки до таблиці доступні кілька «модифікаторів». Наприклад, щоб колонка допускала NULL, використайте метод nullable:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

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

У наступній таблиці зібрані всі доступні модифікатори колонок. Цей перелік не включає модифікатори індексів:

Модифікатор Опис
->after('column') Розмістити колонку «після» іншої колонки (MariaDB / MySQL).
->autoIncrement() Зробити колонки INTEGER автоінкрементними (первинний ключ).
->charset('utf8mb4') Указати набір символів для колонки (MariaDB / MySQL).
->collation('utf8mb4_unicode_ci') Указати collation для колонки.
->comment('my comment') Додати комментар до колонки (MariaDB / MySQL / PostgreSQL).
->default($value) Указати «типове» значення колонки.
->first() Розмістити колонку «першою» в таблиці (MariaDB / MySQL).
->from($integer) Задати початкове значення автоінкрементного поля (MariaDB / MySQL / PostgreSQL).
->instant() Додати або змінити колонку через миттєву (instant) операцію (MySQL).
->invisible() Зробити колонку «невидимою» для запитів SELECT * (MariaDB / MySQL).
->lock($mode) Указати режим блокування для операції з колонкою (MySQL).
->nullable($value = true) Дозволити вставляти в колонку значення NULL.
->storedAs($expression) Створити збережену генеровану колонку (MariaDB / MySQL / PostgreSQL / SQLite).
->unsigned() Зробити колонки INTEGER типу UNSIGNED (MariaDB / MySQL).
->using($expression) Указати вираз приведення під час зміни типу колонки (PostgreSQL).
->useCurrent() Зробити так, щоб колонки TIMESTAMP типово використовували CURRENT_TIMESTAMP.
->useCurrentOnUpdate() Зробити так, щоб колонки TIMESTAMP використовували CURRENT_TIMESTAMP під час оновлення запису (MariaDB / MySQL).
->virtualAs($expression) Створити віртуальну генерувану колонку (MariaDB / MySQL / SQLite).
->generatedAs($expression) Створити identity-колонку із заданими опціями послідовності (PostgreSQL).
->always() Визначає пріоритет значень послідовності над вхідними для identity-колонки (PostgreSQL).

Типові вирази

Модифікатор default приймає значення або екземпляр Illuminate\Database\Query\Expression. Використання Expression не дасть Laravel обгорнути значення в лапки і дозволить застосувати специфічні для БД функції. Особливо це стає в пригоді, коли типові значення потрібно призначити 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
{
    /**
     * Виконати міграції.
     */
    public function up(): void
    {
        Schema::create('flights', function (Blueprint $table) {
            $table->id();
            $table->json('movies')->default(new Expression('(JSON_ARRAY())'));
            $table->timestamps();
        });
    }
};

[!WARNING] Підтримка типових виразів залежить від драйвера БД, її версії й типу поля. Звіряйтеся з документацією своєї бази даних.

Порядок колонок

У MariaDB та MySQL методом after можна додавати колонки після наявної колонки в схемі:

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

Миттєві операції з колонками

У MySQL до визначення колонки можна додати модифікатор instant, який вказує, що колонку слід додати чи змінити алгоритмом MySQL «instant». Цей алгоритм дає змогу виконати певні зміни схеми без повної перебудови таблиці, тому вони майже миттєві незалежно від розміру таблиці:

$table->string('name')->nullable()->instant();

Миттєве додавання колонок може лише дописувати колонки в кінець таблиці, тому модифікатор instant не можна поєднувати з after чи first. До того ж алгоритм підтримує не всі типи колонок і не всі операції. Якщо запитана операція несумісна, MySQL видасть помилку.

Які операції сумісні з миттєвою зміною колонок, дивіться в документації MySQL.

Блокування DDL

DDL Locking, Modifying Columns, Renaming Columns, Dropping Columns, Indexes (Creating Indexes, Renaming Indexes, Dropping Indexes, Foreign Key Constraints), Events.

ЯК ЦЯ СТОРІНКА ВИГЛЯДАЄ В ПОШУКУ
phpukraine.com/docs/laravel/migrations
Міграції | Документація Laravel українською
Міграції у Laravel 13.x: переклад офіційної документації українською. Оновлено 15 вересня 2026. Приклади коду, пояснення та посилання на питання зі співбесід.
Стан перекладу

Перекладаємо з офіційної документації, розділ за розділом, і не ховаємо недоперекладене. Помітили неточність у терміні чи реченні: напишіть, виправимо.

90%
Готовності
10
У роботі
0
Ще не перекладено
Глосарій термінів