Урок 04

Внешние ключи

Внешний ключ — это колонка, которая ссылается на первичный ключ другой таблицы. Он обеспечивает целостность данных: нельзя создать запись со ссылкой на несуществующую запись.

Создание

Через 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.