Наследование доктрины.Есть ли простой способ получить все дочерние классы / таблицы для их использования в поле выбора в symfony forms?
-
23-09-2019 - |
Вопрос
Я только начал использовать symfony 1.4 и Doctrine.(Раньше часто использовал 1.0 - 1.2 + Propel).
Я подумал попробовать Doctrine из-за быстрого и масштабного Процесса разработки в прошлом.
Спасибо jwage ;-)
Я использую наследование таблиц.Это небольшая часть моей схемы.yml:
Articles:
columns:
id:
type: integer(4)
primary: true
notnull: true
autoincrement: true
marken_id:
type: integer(4)
notnull: false
user_id:
type: integer(4)
notnull: false
address_id:
type: integer(4)
notnull: false
...
Vehicles:
inheritance:
extends: Articles
type: concrete
Rennfahrzeuge:
columns:
stvo:
type: boolean
notnull: false
default: false
inheritance:
extends: Vehicles
type: concrete
Tourenwagen:
inheritance:
extends: Rennfahrzeuge
type: column_aggregation
keyField: type
keyValue: 1
...
Sonstige:
inheritance:
extends: Rennfahrzeuge
type: column_aggregation
keyField: type
keyValue: 6
Karts:
inheritance:
extends: Vehicles
type: concrete
TonyKart:
inheritance:
extends: Karts
type: column_aggregation
keyField: type
keyValue: 1
...
Sonstige:
inheritance:
extends: Karts
type: column_aggregation
keyField: type
keyValue: 9
Сейчас я подумываю об использовании простого способа создания правильной формы.
Пользователь должен выбрать поля в верхней части формы (как вы можете видеть здесь : http://msm-esv.dyndns.org/frontend_dev.php/fahrzeuge/insert )
Вы должны выбрать "родительский класс", такой как Rennfahrzeuge или Karts и так далее.
После этого пользователь должен выбрать дочерний класс, такой как Tourenwagen или Sonstige.
Затем страница должна перезагрузиться и отобразить правильную форму.
Есть ли в Doctrine какая-либо функция для получения унаследованных / дочерних классов для их отображения во втором поле выбора?
(например,У Rennfahrzeuge есть Tourenwagen,..,..., Sonstige, а у Karts есть TonyKart,...,...,Sonstige)
После этого я мог бы динамически создавать назначенный класс формы, например:
$chooseMode = $request->getParameter('chooseMode').'Form';
$modeFormClass = new $chooseMode();
или я думал о том, чтобы просто установить правильную модель в родительском классе form.
О чем вы думаете?Я был бы действительно признателен за любые предложения и помощь :-)
Большое спасибо,
Марко
Решение
Существуют ли прямые функции, такие как Доктрина getSubclasses
или PHP - файл get_children_of
?Не то, с чем я сталкивался в Doctrine или PHP.Самое близкое, о чем я знаю, - это функция PHP is_subclass - это_подкласс который вы могли бы использовать при переборе всех ваших возможных классов.
Существенно ли отличаются ваши подклассы от вашей основной модели?Я вижу только один вариант столбца в ваших примерах выше, но я предполагаю, что это было просто для краткости.
Я понимаю привлекательность структуры, которую вы пытаетесь реализовать, но также кажется, что в долгосрочной перспективе это может стать невероятной болью.Можно ли было бы вместо этого создать отдельный VehicleCategory
модель, которая ссылается на саму себя, чтобы обеспечить вложенную структуру, а затем ваш Vehicles
могли бы вы принадлежать к этим категориям?Это имело бы Rennfahrzeuge как категория высшего уровня и Tourenwagen и Sonstige были бы категории с родительским элементом из Rennfahrzeuge с Vehicles
принадлежащий всем троим.Если бы у вас не было слишком большого разнообразия полей в ваших дочерних моделях, вы могли бы включить все пользовательские поля в Vehicles
моделируйте и отображайте / устанавливайте их только в соответствующее время.
Просто несколько мыслей, надеюсь, это поможет.
Другие советы
Если вам нужно найти подклассы записи Doctrine, вы могли бы использовать
$yourSuperObject->getTable()->getOption('subclasses')
или
Doctrine::getTable('SuperClass')->getOption('subclasses');