Что делать, если Doctrine Entity имеют одинаковую структуру?
Начал осваивать Symfony и за основу взял один свой старенький проект, на котором учился класть графы в БД, конкретнее -- MySQL на MyISAM. Перевёл таблички в InnoDB, расставил Foreign Key's -- дабы переложить контроль за целостностью на базу и таким макаром импортировать в Doctrine контроль за целостностью вместе со схемой. Импортирую схему doctrine:mapping:import и... Doctrine ругается "cannot redeclare" на один из столбцов с внешним ключом. Пробую тот же с другого конца, через доктриновские аннотации в Entity. doctrine:generate:entity -- и снова ругань, "cannot redeclare", когда я пытаюсь заджойниться на сущность Location, общую для сущностей Bridge и Building.
Соответственно, вопросы:
1) правильно ли я понимаю, что сущность Location, представленную в базе одной таблицей, придётся разбить на две сущности (и таблицы): LocationOfBridge и LocationOfBuilding?
2) неужели придётся писать два одинаковых контроллера на сущности с одинаковой структурой?
Спасибо за ответ -- понял, что не точно задал вопрос. Что делать, когда понадобится заджойниться из Bridge и Building не только на сущность Location, но и, допустим, на сущности Creator, Shape и несколько других? При этом у Bridge будут свои уникальные джойны (допустим, Station), а у Building (WindowClass, WallpaperColor и т.д.) -- свои.
Если я правильно понимаю, то вы говорите о том, что структура таблиц Building и Bridge будет частично совпадать, а частично отличаться.
Создайте базовую сущность и пропишите маппинг у класса @MappedSuperclass
Таблица для этой сущности создана не будет.
Соответственно все свойства сущности, которые совпадают у Bridge и Building пропишите там.
Унаследуйте Bridge и Building от базовой сущности. У каждой конкретной сущности пропишите необходимые дополнительные свойства.
На выходе получите две таблицы. При этом если понадобится обе сущности мапить на какие то еще дополнительные сущности, то указывайте их в базовом классе, если же отдельную сущность (Building или Bridge) надо замапить, то прописывайте свойство в конкретном классе (Bridge или Building).