Как правильно реализовать удаление категории и перемещение привязанных постов в основную?

Есть какое-то количество категорий (файл миграции категорий)

public function up():void
{
    Schema::create('blog_categories', static function (Blueprint $table) {
        $table->id();
        $table->bigInteger('parent_id')->unsigned()->default(1);

        $table->string('slug')->unique();
        $table->string('title');
        $table->text('description')->nullable();

        $table->timestamps();
        $table->softDeletes();
    });
}

Среди них есть "базовая" введите сюда описание изображения

Все эти категории привязаны к постам (файл миграции постов)

public function up(): void
{
    Schema::create('blog_posts', static function (Blueprint $table) {
        $table->id();
        $table->bigInteger('category_id')->unsigned();
        $table->bigInteger('user_id')->unsigned();

        $table->string('slug')->unique();
        $table->string('title');
        $table->text('excerpt')->nullable();

        $table->string('tdk_title')->nullable();
        $table->text('tdk_description')->nullable();
        $table->text('tdk_keywords')->nullable();

        $table->text('content_raw');
        $table->text('content_html');

        $table->integer('view_count')->default(0);
        $table->boolean('is_published')->default(false);
        $table->timestamp('published_at')->nullable();

        $table->timestamps();
        $table->softDeletes();

        $table->index('is_published');

        //FK
        $table->foreign('user_id')
            ->references('id')
            ->on('users')
            ->onDelete('cascade');
        $table->foreign('category_id')
            ->references('id')
            ->on('blog_categories')
            ->onDelete('cascade');
    });
}

Нужно решить две задачи:

  1. Запретить удаление корневой категории. С этим проблем нет, в destroy() проверить id и если он совпадает вернуть сообщение с ошибкой.
  2. Удалить категорию и переместить все связанные посты в корневую. Вот тут я забуксовал, как правильно реализовать?

Ответы (1 шт):

Автор решения: Yakoffka

Я сделал бы следующим образом: 1 в модели описал бы связь:

/**
 * @return HasMany
 */
public function posts(): HasMany
{
    return $this->hasMany(Post::class);
}

2 при удалении директории получил бы все ее посты:

$posts = $category->posts;

3 ну и обновил бы каждый пост. А затем удалил категорию.

if ( $posts->count() ) {
    foreach ($posts as $post) {
        // update $post
    }
}

$category->delete();
→ Ссылка