Как прятать связанные ресурсы при блокировке пользователя?
Например в таблице пользователей есть поле "blocked" - и если оно true - пользователь не отображается. С этим всё просто. Но есть связанные сущности. Например комментарии или контакты. Там связь Many2One на пользователя. Я попробовал фильтровать их по "blocked" на связанной сущности Пользователь - это привело к увеличению нагрузки на БД более чем в два раза.
Прям в два раза возросло? Может стоит оптимизировать запросы?А нужно ли убирать из отображения комментарии заблокированного пользователя?
Ну удалите всё что с ним связано и перенесите в отдельную таблицу.
Или налепите поле blocked и к комментариям и контактам...
twobomb, Используется api-platform - оно само запросы строит. По статистике не меньше чем в два раза. Я буду ещё проверять. Точно ли из-за этого. Если сам подход правильный. Например Сообщения могут содержать спам. Их нужно прятать. Также спам может быть в коммента. Блокируется автоматически, до прихода модератора. Там может быть ложное срабатывание, и всё нужно возвращать потом как было. Это гемор, если под каждую сущность доп таблицу делать имхо
это привело к увеличению нагрузки на БД более чем в два раза.
Небось, за счёт того, что теперь в каждый запрос добавилось
SELECT ...
FROM ...
JOIN users ON ...
WHERE ...
AND NOT users.blocked
...
Тогда:
1. В каждую таблицу добавляется поле blocked. Потому что связанная сущность, как я понимаю, может блокироваться и для неблокированного пользователя (скажем, нормальный пользователь по скудоумию зарепостил что-то нелегитимное, или просто под настроение крепко высказался - достаточно блокировать только сам предосудительный пост/коммент). При этом фильтрация выполняется без привязывания таблицы пользователей.
2. На таблицу users повесить AFTER UPDATE триггер, который при изменении (либо только при установке в TRUE) поля blocked будет изменять соотв. поле у связанных записей. Впрочем, согласен с twobomb - то, что юзер заблокирован, не делает все его ранние посты предосудительными и требующими блокирования.