Как узнать, не связана ли запись с какими-либо другими отношениями? - PullRequest
0 голосов
/ 17 марта 2020

У меня есть проект с doctrine сущностями, и моя общая задача - найти неиспользуемые записи одной сущности.

Скажем, у меня есть сущность Image и множество других разных сущностей. Некоторые из них имеют разные отношения с Image, определенные с Doctrine. Мне нужно найти записи изображений, которые никогда нигде не использовались.

Нужно отметить, что в изображении есть только одно поле с отношением Image::$user, а другие инвертированы: Foo::$image, Bar::$image, et c Просто потому, что они мне вообще не нужны.


Сначала я пытался написать raw SQL:

SELECT i.id
FROM `image`    AS i
JOIN `user`     AS u ON u.id = i.user_id
LEFT JOIN `foo` AS f ON u.id = f.user_id AND i.id = f.image_id
LEFT JOIN `bar` AS b ON u.id = b.user_id AND i.id = b.image_id
WHERE   f.id IS NULL
    AND b.id IS NULL
;

Это работает, но я не не нравится, потому что у него жестко закодированные имена таблиц и столбцов, и если у вас их более 10 ... поддержка, которая разочаровывает.


Есть ли какое-то решение для этого случая? Я знаю, что Doctrine имеет собственную информацию о сопоставлении с $entityManager->getMetadataFactory()->getMetadataFor(Image::class)->getAssociationMappings(), но нет информации ни о чем, кроме Image::$user.

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