Актуализация связей M:M в таблице связующей таблице

StalkerClasses

Новичок
При создании выбора нескольких значений как правило используется три таблицы:
blog
tag
blog_tag

Допустим есть связь между блогом и тэгом - есть соответствуюащая запись в таблице blog_tag.
Но вот пользователь удалил 1 блог или удали 1 тэг. Но соответствующую запись то он не удалял в таблице blog_tag.
Кто как актуализирует данные в связующей таблице?
 

AnrDaemon

Продвинутый новичок
Если совсем точнее, то соответствующим образом настроенные события на внешних ключах.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Если еще более точно - то 'ON DELETE CASCADE' (в мускуле)
 

StalkerClasses

Новичок
Боюсь я не смогу использовать ключи.
У меня все связи хранятся в 1 таблице. sys_mm.
В ней есть 4 поля (таблица, колонка, id-внешний, id-локальный)
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Что значит "Боюсь я не смогу использовать ключи." Тебе религия запрещает или что? Ты можешь у себя там хранить что угодно и как угодно, но это не отменяет того, что надо сделать как правильно.
 

StalkerClasses

Новичок
Полиморфная связь это полиморфная связь. Здесь вместо таблицы blogtag я использую sys_mm. Все связи где у меня идёт m:m отношение попадают в эту таблицу и мне нет смысла создавать доп модели на связи.
Что значит "Боюсь я не смогу использовать ключи." Тебе религия запрещает или что? Ты можешь у себя там хранить что угодно и как угодно, но это не отменяет того, что надо сделать как правильно.
правильно это как?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Я уже написал как правильно. У тебя может быть одна таблица с тэгами и она может ключами привязываться к нескольким сущностям. Тэги в новостях, тэги в товарах, тэги в фотках и так далее. Без всяких sys_mm. У нас было похожее хранилище, но там не тэги были. В итоге мы отказались от этого и сделали несколько дополнительных таблиц именно ради автоматического поддержания целостности связей на уровне БД. Потратили день.

Ну либо руками следить и удалять.
 
Последнее редактирование:

StalkerClasses

Новичок
У меня получился вот такой запрос:
Код:
SELECT

sys_mm.id AS idSysMm,
sys_mm.id_f,
sys_mm.id_l
#tableBlog.id AS 'idBlog',
#tableTag.id AS 'idTag'

FROM sys_mm

LEFT JOIN table_blog AS tableBlog ON tableBlog.id = sys_mm.id_f
LEFT JOIN table_tag AS tableTag ON tableTag.id = sys_mm.id_l

WHERE

sys_mm.tablename = 'table_blog' AND
sys_mm.fieldname = 'tag_list' AND
(
tableBlog.id IS NULL
OR
tableTag.id IS NULL
)

GROUP BY sys_mm.id
Выводится список всех которые не принадлежат ни одному блогу и(или) ни одному тэгу.
Вот только как теперь автоматизировать DELETE данных связей?
 

AnrDaemon

Продвинутый новичок
Добавить внешний ключ на нужную таблицу с ON DELETE CASCADE.
Будет само удаляться.
 

Reuniko

Новичок
Лучше всего, конечно, использовать внешние ключи бд, которые сами будут удалять элементы, ссылающиеся на ничто.
Если по каким-то причинам это невозможно, есть вариант реализовать контроль целостности на уровне PHP в модели,
грубо говоря в метод "Удалить блог по айди" после удаления блога добавить удаление всех записей в таблице blog_tag, ссылающихся на блог.
 
Сверху