Метод constrained
Метод constrained используется в миграциях для создания внешнего ключа с автоматическим определением целевой таблицы и столбца. Метод применяется к определению поля foreignId и упрощает создание внешних ключей. Он автоматически определяет таблицу и столбец, на которые ссылается внешний ключ, на основе названия поля. Если поле называется 'user_id', метод будет ссылаться на таблицу 'users' и столбец 'id'. Также метод позволяет настроить действия при удалении с использованием дополнительных методов.
Синтаксис
<?php
Schema::table('table_name', function (Blueprint $table) {
$table->foreignId('column_name')->constrained();
});
Schema::table('table_name', function (Blueprint $table) {
$table->foreignId('column_name')->constrained('table_name');
});
Schema::table('table_name', function (Blueprint $table) {
$table->foreignId('column_name')->constrained('table_name', 'column_name');
});
?>
Пример автоматического создания внешнего ключа
Давайте создадим внешний ключ в таблице '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();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('posts');
}
};
?>
Результат выполнения кода:
"Foreign key 'posts_user_id_foreign' created on table 'posts'"
Пример с указанием таблицы и столбца
Давайте явно укажем таблицу и столбец для внешнего ключа:
<?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->text('comment');
$table->foreignId('post_id')->constrained('posts', 'id');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('comments');
}
};
?>
Результат выполнения кода:
"Foreign key 'comments_post_id_foreign' created on table 'comments'"
Пример с действиями при удалении
Давайте настроим каскадное удаление при удалении связанной записи:
<?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->text('comment');
$table->foreignId('post_id')->constrained()->cascadeOnDelete();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('comments');
}
};
?>
Результат выполнения кода:
"Foreign key 'comments_post_id_foreign' created with cascade on delete"
Пример использования в существующей таблице
Давайте добавим внешний ключ в существующую таблицу:
<?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('posts', function (Blueprint $table) {
$table->foreignId('category_id')->nullable()->constrained();
});
}
public function down(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->dropForeign(['category_id']);
$table->dropColumn('category_id');
});
}
};
?>
Результат выполнения кода:
"Foreign key 'posts_category_id_foreign' added to table 'posts'"
Смотрите также
-
метод
foreign,
который создает внешний ключ вручную -
метод
foreignId,
который создает поле для внешнего ключа -
метод
cascadeOnDelete,
который добавляет каскадное удаление -
метод
table,
который используется для изменения существующей таблицы