nekrasov444
@nekrasov444

Как удалить строку и все что с ней связанно в других таблицах?

Здравствуйте, есть "посты" и "категории" (ниже миграции), когда создаем пост выбираем категорию и в поле category_id ставится id категории. Проблема в том что когда удаляешь категорию в таблице post в category_id все остается по прежнему. Подскажите как поставить дефолт значения посту при удалении его категории. Например удаляем категорию "1" и все посты которые были на этой категории перемещаются на категорию "0".

Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->integer('user_id')->unsigned();
            $table->string('title');
            $table->text('body');
            $table->string('category_id');
            $table->timestamps();
        });


Schema::create('categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->timestamps();
        });
  • Вопрос задан
  • 243 просмотра
Решения вопроса 3
be_a_dancer
@be_a_dancer
Middle Backend/Fullstack Developer
В этих случаях необходимо делать внешние ключи.

Schema::table('posts', function (Blueprint $table) {
    $table->foreign('category_id')->references('id')->on('categories')->onUpdate('cascade')->onDelete('cascade');
});


При коде выше, пост удалится. В случае с оставлением постов необходимо написать

Schema::table('posts', function (Blueprint $table) {
    $table->foreign('category_id')->references('id')->on('categories')->onUpdate('cascade')->onDelete('SET NULL');
});


Рекомендую освежить свои знания в матчасти.
Ответ написан
@vista1x
О внешних ключах слышали? Сделайте связь между таблицами на уровне БД и установите ON DELETE SET NULL
Ответ написан
AnatolTh
@AnatolTh
Full Stack Developer
Можно через триггер, на случай если будет сложная логика. В Observer при событии Deleting или Deleted (т.к. у вас нет ключей) обновите поле category_id с айдишника равного удалённой категории на дефолтное. Либо посредством onDelete(), если объявить ключ

И почему
$table->string('category_id');
а не
$table->bigInteger('category_id');
?

UPD
Schema::create('tasks', function (Blueprint $table) {
   $table->bigIncrements('id');
   $table->bigInteger('user_id');
   $table->string('title');
   $table->text('body');
   $table->bigInteger('category_id')->unsigned();
   $table->timestamps();
});
Schema::create('categories', function (Blueprint $table) {
   $table->bigIncrements('id');
   $table->string('name');
   $table->timestamps();
});
Schema::table('tasks', function ($table) {
   $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@LaraLover
Post::where('category_id', $category->id)->update($newvalue);

Если настроены отношения, то можно как-то так :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
05 июл. 2020, в 13:35
50000 руб./за проект
05 июл. 2020, в 13:11
3000 руб./за проект
05 июл. 2020, в 12:50
1000 руб./за проект