问题描述
我创建了一个表格来保存帖子和类别之间的关系.
I created a table to save post and category relationship.
Schema::create('post__post_category_relations', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->integer('post_id')->unsinged();
$table->integer('category_id')->unsinged();
});
如果我删除一个类别,我希望如果该帖子只有一个类别,则该类别的帖子将移至未分类"类别(ID = 1).
If I delete a category, I want posts of this category will move to 'Uncategorized' Category (with ID = 1) if post only have one a category.
这是我在CategoryController上的脚本:
This is my script at 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万个帖子,当我要删除类别时会非常慢.你能告诉我更好的主意吗?谢谢!
It working but I think it is'nt optimize. Because I must use the loop to find post only have one category. If I have 1 million posts, will very slow when I want delete a category. Can you show me better ideas? Thanks!
推荐答案
这可能会解决问题:
$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,并通过一个查询在数据库中对其进行了更新.
First you get the posts with count of their related categories in a single query.Then you filter only the posts with 1 or 0 categories. Finally you get their IDs and update them in the DB with a single query.
这篇关于在Laravel中删除旧帖子类别后,将帖子移至“未归类"类别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!