@salk15

Как добавлять/удалять ключевые слова (теги) в БД (многие ко многим)?

Доброго времени суток. Столкнулся с проблемой, при изменении тегов к статье.

Сразу скажу что связь тегов и статей осуществлена по принципу "многие ко многим".
Имеется форма на странице сайта для редактирования статьи1 и тегов к примеру теги "php, mysql, javascript" (в input type=text и указаны через запятую) привязаны к этой статье1. В базе уже имеются теги помимо привязанных к статье1 к примеру "css" и другие.
Пользователь удаляет тег "js" и добавить два тега "css" и "html"
Вопросы:
Как организовать так чтобы тег "js" был удалён если больше нет привязок к нему иначе просто удалить связь со статьёй1 ?
Как добавить теги "css" и "html" если тег "css" уже существует в БД, а тег "html" абсолютно новый ?
Как осуществить запросы к базе и циклы?
  • Вопрос задан
  • 437 просмотров
Пригласить эксперта
Ответы на вопрос 2
@ReFeRy
Отношение многие ко многим в реляционных бд реализуется через отдельную таблицу отношения "post_id, tag_id". При редактировании статьи анализариуете старую строку тэгов и новую. Для неизмененных тэгов ничего не делаете, для новых создаете новое отношение, для удаленных удаляете отношение.

По поводу новых тэгов или уже существующих. Если тэги у вас больше нигде не используются вообще, то можно не делать отдельной таблицы тэгов, а схему таблицы отношений изменить на "post_id, tag". В таком случае больше вообще не нужно делать никаких телодвижений.

Если же необходимо иметь отдельную таблицу тэгов со счетчиком их использования, то придется делать дополнительные запросы с инкрементом/декрементом счетчика. Для оптимизации количества запросов посмотрите в сторону конструкции insert or update.
Ответ написан
Stalker_RED
@Stalker_RED
Связь многие-ко многим в виде отдельной таблицы
oPccoGy.png

Перед каждой опрацией с тегами желательно знать id тех тегов, которые вы собираетесь удалять или добавлять. Если у вас с клиента приходят не id а строки, то узнаем id так:

select id, name from tag where name in ('js', 'css', 'html')

Также нужно вытащить все теги, которые уже привязаны к статье:
select tag_id from article_has_tag where article_id=1234

Пусть, к примеру, будет js = 111 и css = 222.

Как организовать так чтобы тег "js" был удалён если больше нет привязок к нему иначе просто удалить связь со статьёй1?
Вам обязательно удалять неиспользуемый тег? Это конечно можно сделать, но проще оставить его в таблице, авось еще пригодится для следующих статей. В крайнем случае можно сделать отдельную "удалялку мусора" и запускать ее иногда.
Удалять связь со статьей как-то так:
delete from article_has_tag where article_id=1234 and tag_id=111


Как добавить теги "css" и "html" если тег "css" уже существует в БД, а тег "html" абсолютно новый ?
Так как мы уже пытались узнать id тегов, мы можем понять, что если id для тега "html" не нашелся, то он новый. И добавляем его так:
INSERT INTO tag ('html')
И сразу узнаем какой у него id
$id = mysqli_insert_id(); (возможно у вас используется доступ не через mysqli а через PDO или какую-то ORM, но подобные методы есть везде.) Пусть к примеру вернется 333.
Привязываем теги к статье:
insert into article_has_tag (article_id, tag_id) values (1234, 222), (1234, 333)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы