Как правильно реализовать удаление категории и перемещение привязанных постов в основную?
Есть какое-то количество категорий (файл миграции категорий)
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');
});
}
Нужно решить две задачи:
- Запретить удаление корневой категории. С этим проблем нет, в destroy() проверить id и если он совпадает вернуть сообщение с ошибкой.
- Удалить категорию и переместить все связанные посты в корневую. Вот тут я забуксовал, как правильно реализовать?
Ответы (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();
