Метод foreign
Метод foreign класса Blueprint применяется для определения внешнего ключа в таблице базы данных. Он указывает, что колонка ссылается на другую таблицу, обеспечивая целостность данных. Первым параметром передается имя колонки, вторым - замыкание или массив опций для настройки связи.
Синтаксис
<?php
Schema::table('table_name', function (Blueprint $table) {
$table->foreign('column_name')
->references('id')
->on('related_table');
});
?>
Пример
Создадим таблицу posts с внешним ключом на таблицу users:
<?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('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->foreignId('user_id')
->constrained()
->onDelete('cascade');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('posts');
}
};
?>
Пример
Добавим внешний ключ в существующую таблицу comments с использованием метода foreign:
<?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::table('comments', function (Blueprint $table) {
$table->foreign('post_id')
->references('id')
->on('posts')
->onDelete('cascade');
});
}
public function down(): void
{
Schema::table('comments', function (Blueprint $table) {
$table->dropForeign(['post_id']);
});
}
};
?>
Пример
Использование метода foreign с составным ключом и каскадным обновлением:
<?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('orders', function (Blueprint $table) {
$table->id();
$table->integer('user_id');
$table->integer('product_id');
$table->integer('quantity');
$table->timestamps();
$table->foreign(['user_id', 'product_id'])
->references(['id', 'id'])
->on('users_products')
->onUpdate('cascade')
->onDelete('restrict');
});
}
public function down(): void
{
Schema::dropIfExists('orders');
}
};
?>
Смотрите также
-
метод
dropForeign,
который удаляет внешний ключ -
метод
constrained,
который упрощает создание внешнего ключа -
метод
disableForeignKeyConstraints,
который отключает проверку внешних ключей -
метод
cascadeOnDelete,
который добавляет каскадное удаление