Метод 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,
который добавляет ограничение внешнего ключа