Наследование доктрины.Есть ли простой способ получить все дочерние классы / таблицы для их использования в поле выбора в symfony forms?

StackOverflow https://stackoverflow.com/questions/2346742

Вопрос

Я только начал использовать 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');

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top