Метод foreignIdFor
Метод foreignIdFor применяется в миграциях Laravel для создания поля внешнего ключа. Он принимает модель, с которой устанавливается связь, и автоматически определяет правильное имя колонки и тип данных. По умолчанию создаётся колонка с именем, состоящим из имени модели в нижнем регистре и суффикса _id.
Синтаксис
<?php
Schema::create('posts', function (Blueprint $table) {
$table->foreignIdFor(User::class);
});
?>
Пример
Создадим таблицу posts с внешним ключом на таблицу users:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use App\Models\User;
return new class extends Migration
{
public function up(): void
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->foreignIdFor(User::class);
$table->string('title');
$table->text('content');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('posts');
}
};
?>
В результате будет создана таблица с полем user_id типа BIGINT.
Пример
Укажем кастомное имя колонки для внешнего ключа:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use App\Models\User;
return new class extends Migration
{
public function up(): void
{
Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->foreignIdFor(User::class, 'author_id');
$table->text('body');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('comments');
}
};
?>
Теперь поле внешнего ключа получит имя author_id.
Пример
Добавим ограничение внешнего ключа с каскадным удалением:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use App\Models\User;
return new class extends Migration
{
public function up(): void
{
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->foreignIdFor(User::class)
->constrained()
->onDelete('cascade');
$table->integer('amount');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('orders');
}
};
?>
При удалении пользователя все его заказы будут удалены автоматически.
Пример
Создадим поле внешнего ключа, которое может быть пустым:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use App\Models\User;
return new class extends Migration
{
public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->foreignIdFor(User::class)
->nullable()
->constrained()
->nullOnDelete();
$table->string('name');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('products');
}
};
?>
Теперь поле user_id может содержать значение NULL, а при удалении пользователя значение в этом поле станет NULL.
Смотрите также
-
метод
foreignId,
который создаёт поле внешнего ключа без привязки к модели -
метод
id,
который создаёт первичный ключ -
метод
unsignedBigInteger,
который создаёт целочисленное поле -
метод
foreign,
который добавляет ограничение внешнего ключа