在Laravel中删除旧帖子类别时,将帖子移至“未分类”类别

时间:2018-05-28 09:57:32

标签: php laravel

我创建了一个表来保存帖子和类别关系。

Schema::create('post__post_category_relations', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->integer('post_id')->unsinged();
        $table->integer('category_id')->unsinged();
    });

如果我删除某个类别,我希望此类别的帖子会移至“未分类”类别(ID = 1),如果帖子只有一个类别。

这是我在CategoryController上的脚本:

 public function destroy(Category $category)
{

    $this->category->destroy($category);

    foreach($category->posts as $post){
        if(count($post->categories) <= 1){
            PostCategoryRelations::where('post_id',$post->id)->update(['category_id' => 1]);
        }
    }
}

和类别模型:

public function posts()
{
    return $this->belongsToMany(Post::class, 'post__post_category_relations', 'category_id');
}

和帖子模型:

public function categories()
{
    return $this->belongsToMany(Category::class, 'post__post_category_relations', 'post_id');
}

它工作但我认为它没有优化。因为我必须使用循环来查找帖子只有一个类别。如果我有100万个帖子,当我想删除一个类别时会很慢。你能告诉我更好的想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

这可能会起到作用:

$postsOfCategory = $category->posts()->withCount('categories')->get();
$postsWithOneCategory = $postsOfCategory->filter(function ($post) {
    return $post->categories_count <= 1;
});
$postsIDs = $postsWithOneCategory->pluck(['id'])->toArray();

PostCategoryRelations::whereIn('post_id', $postsIDs)->update(['category_id' => 1]);

首先,您可以在一个查询中获得包含相关类别计数的帖子。 然后,您只过滤具有1或0个类别的帖子。最后,您可以通过单个查询获取其ID并在数据库中更新它们。