У меня есть проект с 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
.