我创建了一个表来保存帖子和类别关系。
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万个帖子,当我想删除一个类别时会很慢。你能告诉我更好的想法吗?谢谢!
答案 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并在数据库中更新它们。