Переместить сообщение в категорию «Без категории» при удалении старой категории сообщения в Laravel - PullRequest
0 голосов
/ 28 мая 2018

Я создал таблицу для сохранения связи между публикацией и категорией.

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

Если я удалю категорию, я хочу, чтобы сообщения этой категории переместились в категорию «Без категории» (с идентификатором = 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');
}

Это работает, но я думаю, что это не оптимизировать.Потому что я должен использовать цикл, чтобы найти пост только одной категории.Если у меня будет 1 миллион сообщений, будет очень медленно, когда я хочу удалить категорию.Можете ли вы показать мне лучшие идеи?Спасибо!

1 Ответ

0 голосов
/ 28 мая 2018

Это может помочь:

$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 категориями.Наконец вы получаете их идентификаторы и обновляете их в БД одним запросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...