с B или C, то есть методом скажем A->getRelation() я хочу получить либо B либо C
В и С не наследуются друг от друга, но имплементируют один интерфейс
я вполне представляю как такое сделать в базе (заводим 2 поля, одно для уникального ключа сущьности, второе для названия сушьности), вопрос в том, возможно ли такое сделать в терминах доктрины, без своих костылей?
Вроде сюда подходит Inheritance Mapping Наследуешь B и C от общей сущности. Эту общую сущность объявляешь как MappedSuperClass , и спомощью поля-дискриминатора даешь доктрине понять какой класс где использовать /** * @MappedSuperclass * @DiscriminatorColumn(name=«type», type="string") * @DiscriminatorMap({«a» = «ClassA», «b» = «Class»B}) **/ Потом создаешь связь из А на этот MappedSuperclass. Можно даже раскидать разных наследников по разным таблицам БД если нужуно. Как-то так.
Да, я так делал, но в данном случае сущности уже заведены в базе (и там много записей и связей между ними), подсунуть им теперь общего предка представляется весьма трудоемкой задачей (коллизии id), но уже не важно, я пошел по пути рефакторинга с вынеманием общего функционала в отдельную сущность (сделал композицию заместо наследования) спасибо
Ну как раз для такого можно указывать в каждом наследнике свою таблицу. Но раз уже решил, то ок )))
там таблица то у всех будет отдельная да, но id нужен общий если я правильно помню, там создается отдельная таблица родитель, в которой будут лежать поля абстрактоного класа, в частности id и этот id должен быть сквозным длявсех наследников (тоесть толжен быть только один наследник с id=1 и т.д.). В ситуации когда уже есть куча записей с id и на эти записи ссылаются другие таблицы..... В общем то можно сделать новый сурагатный ключь, но это както грязно чутка:)
Вот тут задумался. У меня Doctrine с MongoDB, и там нет никакой коллекции родителя. Теоретически ID могут пересекатся, так в ссылке есть не только ID а ещё и тип (дискриминант). Другое дело что в монге в принципе ID по всей БД не могут пересекатся. ))) Интересно как это под капотом в случае с ORM а не ODM.
Обсуждают сегодня