Внешние ключи
Внешний ключ — это колонка, которая ссылается на первичный ключ другой таблицы. Он обеспечивает целостность данных: нельзя создать запись со ссылкой на несуществующую запись.
Создание
Через foreignId
$table->foreignId('user_id')->constrained();
Создаёт:
- колонку
user_idтипа BIGINT UNSIGNED - внешний ключ на
users.id
По соглашению, имя таблицы выводится из имени колонки: user_id → users.
Явное указание
$table->foreignId('author_id')->constrained('users');
Через foreign
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
Поведение при удалении
Cascade
Удалить связанные записи:
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
Null on delete
Обнулить ссылку:
$table->foreignId('user_id')->constrained()->nullOnDelete();
Restrict
Запретить удаление, если есть связанные записи:
$table->foreignId('user_id')->constrained()->restrictOnDelete();
Поведение при обновлении
$table->foreignId('user_id')->constrained()->cascadeOnUpdate();
Составной внешний ключ
$table->foreign(['user_id', 'role_id'])
->references(['id', 'role_id'])
->on('users');
Удаление внешнего ключа
$table->dropForeign(['user_id']);
Если миграция создаёт внешний ключ через foreignId()->constrained(), drop-метод тоже работает по имени колонки.
Отключение проверок
На время миграции можно отключить проверки внешних ключей:
Schema::disableForeignKeyConstraints();
// ...
Schema::enableForeignKeyConstraints();
Порядок создания таблиц
Если таблица posts ссылается на users, сначала должна быть создана users. Имена миграций начинаются с даты, поэтому порядок задаётся вручную: создай миграцию для users раньше, чем для posts.