Логическая ошибка при добавлении тега для публикации в Laravel

Я пытаюсь добавить функцию добавления тега для сообщения в laravel. Это код обновления:

public function update(PostRequest $request, $id)
{
    $post = Post::find($id);

    $post->update($request->all());

    if ($request->tags) {
        $tagNames = explode(',', $request->tags);
        $tagIds = [];

        foreach ($tagNames as $tagName) {
            $tagCount = Tag::where('name', '=', $tagName)->count();
            if ($tagCount < 1) {
                $tag = $post->tags()->create(['name' => $tagName]);
            } else {
                $post->tags()->detach();
                $tag = Tag::where('name', $tagName)->first();
            }
            $tagIds[] = $tag->id;
        }
        $post->tags()->sync($tagIds);
    }

    return back()->with('success', 'Successfully');
}

Он хорошо работает со сводной таблицей, это было решено.

Моя проблема заключается в таблице тегов. Когда я удаляю все теги и повторно набираю новый тег или существующий тег, все работает.

Но когда я не изменяю или сохраняю старый тег и продолжаю добавлять новый тег, это вызовет логическую ошибку. Он автоматически добавит запись в таблицу тегов. Например: у моего поста 3 тега: test1, test2, test3. Я сохраняю его и добавляю тег: test4, затем в тег таблицы автоматически добавляются теги: test2, test3, test4.

Есть ли решение моей проблемы? Где я ошибся? Я потратил на это почти 2 дня. Я не хочу использовать пакет. Голосуйте за полезный ответ.


person Mina    schedule 19.08.2017    source источник
comment
Это многие ко многим? Почему вы отрываете тег? Это будет sync в любом случае.   -  person shukshin.ivan    schedule 19.08.2017
comment
Да, это много ко многим. Что я должен делать?   -  person Mina    schedule 19.08.2017
comment
Мне любопытно, правильно ли я понял ошибку. Опишите, пожалуйста, что не так с вашим кодом? Это неправильная запись в таблице тегов или неправильное отношение?   -  person shukshin.ivan    schedule 19.08.2017


Ответы (1)


Во-первых, используйте firstOrCreate, это коротко и удобно. Тогда не отсоединяйте, это бесполезно, sync делает связанные теги так же, как и массив tagIds, убирает из сводной таблицы несуществующие элементы и добавляет новые.

Кроме того, у вас есть пробелы между запятыми и словами, поэтому вам нужно trim это.

if ($request->tags) {
    $tagNames = explode(',', $request->tags);
    $tagIds = [];

    foreach ($tagNames as $tagName) {
        $tag = Tag::firstOrCreate(['name' => trim($tagName)]);
        $tagIds[] = $tag->id;
    }
    $post->tags()->sync($tagIds);
}

Кажется, я понял твою ошибку, она здесь

if ($tagCount < 1) {
    $tag = $post->tags()->create(['name' => $tagName]);
} else {
    $post->tags()->detach();
    $tag = Tag::where('name', $tagName)->first();
}

Это означает, что когда вы передаете новый тег, он удаляет все связанные теги из сообщения. Если вы передаете только старые теги, они не удаляются.

person shukshin.ivan    schedule 19.08.2017
comment
Неважно, что у сводной таблицы post_tag, но проблема с таблицей тегов. - person Mina; 19.08.2017