Поле foreignId
Метод foreignId применяется в миграциях Laravel для создания поля внешнего ключа. Он создаёт целочисленное поле без знака (unsigned big integer) и является сокращённым вариантом для определения связи между таблицами. Первым и единственным параметром передаётся имя колонки, которая будет хранить идентификатор связанной записи. По умолчанию поле создаётся без индексов и ограничений.
Синтаксис
<?php
Schema::create('table_name', function (Blueprint $table) {
$table->foreignId('column_name');
});
?>
Пример
Давайте создадим таблицу 'posts' с полем 'user_id', которое будет внешним ключом к таблице '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->foreignId('user_id');
$table->string('title');
$table->text('content');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('posts');
}
};
?>
В результате будет создана таблица со следующими полями:
"id (bigint unsigned)"
"user_id (bigint unsigned)"
"title (varchar)"
"content (text)"
"created_at (timestamp)"
"updated_at (timestamp)"
Пример
Для создания внешнего ключа с автоматической проверкой целостности данных используется метод constrained. Давайте добавим ограничение, которое будет ссылаться на таблицу '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('comments', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained();
$table->foreignId('post_id')->constrained();
$table->text('comment');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('comments');
}
};
?>
При создании внешнего ключа с constrained Laravel автоматически определит имя таблицы, на которую ссылается ключ, и создаст соответствующий индекс. По умолчанию используется ограничение 'ON DELETE NO ACTION'.
Пример
Чтобы автоматически удалять связанные записи при удалении родительской, используется метод cascadeOnDelete. Давайте создадим таблицу 'profiles' с каскадным удалением:
<?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('profiles', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')
->constrained()
->cascadeOnDelete();
$table->string('bio');
$table->string('avatar');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('profiles');
}
};
?>
Теперь при удалении пользователя все его профили будут автоматически удалены.
Пример
Метод foreignId можно комбинировать с другими методами для создания более сложных ограничений. Например, указать конкретную таблицу и колонку для связи:
<?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->foreignId('customer_id')
->constrained('users', 'id')
->cascadeOnDelete();
$table->foreignId('product_id')
->constrained('products', 'id')
->cascadeOnDelete();
$table->integer('quantity');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('orders');
}
};
?>
В этом примере мы явно указываем, что поле 'customer_id' ссылается на таблицу 'users' и колонку 'id', а поле 'product_id' - на таблицу 'products' и колонку 'id'.
Смотрите также
-
метод
foreign,
который создаёт внешний ключ с указанием всех параметров -
метод
foreignIdFor,
который создаёт внешний ключ на основе модели -
метод
constrained,
который добавляет ограничение внешнего ключа -
метод
cascadeOnDelete,
который обеспечивает каскадное удаление