РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
118 of 1392 menu

Метод nullOnDelete

Метод nullOnDelete применяется при определении внешнего ключа в миграциях Laravel. Он указывает, что при удалении связанной записи внешний ключ текущей записи должен быть установлен в значение NULL. Это позволяет сохранить запись, но разорвать связь с удалённой записью.

Синтаксис

<?php Schema::table('table_name', function (Blueprint $table) { $table->foreignId('column_name') ->constrained('related_table') ->nullOnDelete(); }); ?>

Метод nullOnDelete не принимает никаких параметров и всегда вызывается в цепочке после методов определения внешнего ключа.

Пример с постами и пользователями

Давайте создадим таблицу posts, у которой внешний ключ user_id ссылается на таблицу users. При удалении пользователя внешний ключ в постах должен стать NULL:

<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up() { Schema::create('posts', function (Blueprint $table) { $table->id(); $table->string('title'); $table->text('content'); $table->foreignId('user_id') ->constrained('users') ->nullOnDelete(); $table->timestamps(); }); } public function down() { Schema::dropIfExists('posts'); } }; ?>

Результат выполнения миграции:

"Table posts created successfully with foreign key user_id referencing users.id with null on delete"

Пример с комментариями

Теперь создадим таблицу comments, у которой внешний ключ post_id ссылается на таблицу 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() { Schema::create('comments', function (Blueprint $table) { $table->id(); $table->string('content'); $table->foreignId('post_id') ->constrained('posts') ->nullOnDelete(); $table->timestamps(); }); } public function down() { Schema::dropIfExists('comments'); } }; ?>

Результат выполнения миграции:

"Table comments created successfully with foreign key post_id referencing posts.id with null on delete"

Пример с использованием модели

Давайте создадим модель Post и проверим поведение при удалении связанной записи:

<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Post extends Model { use HasFactory; protected $fillable = ['title', 'content', 'user_id']; } ?>
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class User extends Model { use HasFactory; protected $fillable = ['name', 'email']; } ?>
<?php use App\Models\Post; use App\Models\User; use Illuminate\Support\Facades\Route; Route::get('/test-null-on-delete', function () { $user = User::create([ 'name' => 'John Doe', 'email' => 'john@example.com' ]); $post = Post::create([ 'title' => 'My first post', 'content' => 'This is the content of my first post', 'user_id' => $user->id ]); $user->delete(); $res = Post::find($post->id); return $res->user_id; }); ?>

Результат выполнения кода:

"null"

Сравнение с другими методами

В отличие от cascadeOnDelete, который удаляет записи, и от restrictOnDelete, который запрещает удаление, метод nullOnDelete позволяет сохранить записи, но сбросить связь с удалённой сущностью.

Смотрите также

  • метод cascadeOnDelete,
    который каскадно удаляет связанные записи
  • метод restrictOnDelete,
    который запрещает удаление связанной записи
  • метод foreign,
    который определяет внешний ключ
  • метод constrained,
    который добавляет ограничение внешнего ключа
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить