cascadeOnDelete
Метод cascadeOnDelete применяется к определению внешнего ключа в миграциях Laravel и позволяет автоматически удалять все связанные дочерние записи при удалении родительской записи. Метод вызывается после определения внешнего ключа с помощью метода constrained или foreign. При использовании cascadeOnDelete в базе данных создается ограничение внешнего ключа с опцией ON DELETE CASCADE, что гарантирует целостность данных на уровне базы данных.
Синтаксис
<?php
Schema::table('table_name', function (Blueprint $table) {
$table->foreignId('column_name')
->constrained('parent_table')
->cascadeOnDelete();
});
?>
Пример
Давайте создадим миграцию для таблицы comments, в которой внешний ключ user_id будет каскадно удалять все комментарии пользователя при его удалении:
<?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('users')
->cascadeOnDelete();
$table->text('content');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('comments');
}
};
?>
После выполнения миграции, при удалении пользователя все его комментарии будут автоматически удалены из базы данных.
Пример
Метод cascadeOnDelete можно использовать в отдельной миграции для добавления каскадного удаления к уже существующему внешнему ключу:
<?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->dropForeign(['user_id']);
$table->foreign('user_id')
->references('id')
->on('users')
->cascadeOnDelete();
});
}
public function down(): void
{
Schema::table('comments', function (Blueprint $table) {
$table->dropForeign(['user_id']);
$table->foreign('user_id')
->references('id')
->on('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('orders', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')
->constrained('users')
->cascadeOnDelete();
$table->foreignId('product_id')
->constrained('products')
->cascadeOnDelete();
$table->integer('quantity');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('orders');
}
};
?>
Теперь при удалении пользователя или товара все связанные заказы будут автоматически удалены.
Смотрите также
-
метод
foreign,
который определяет внешний ключ в таблице -
метод
constrained,
который добавляет ограничение внешнего ключа -
метод
nullOnDelete,
который устанавливает NULL при удалении родительской записи -
метод
dropForeign,
который удаляет внешний ключ