Я хочу, чтобы в моей модели была следующая ситуация
У меня есть разные типы конкретных транспортных средств, такие как bicycle, motorcycle, car и truck.
Поскольку запрос данных из сопоставленного суперкласса невозможен, в моей ситуации он не используется.
Поэтому, чтобы иметь возможность запрашивать все автомобили, я решил объявить vehicle как самую верхнюю сущность и создал сущность с типом наследования JOINED. Кроме того, я должен иметь возможность запросить более подробный тип позже. Поэтому я объединяю их в группы TwoWheeler (мотоциклы и велосипеды) и FourWheeler (легковые и грузовые автомобили).
* @ORM\Entity()
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name = "type",type = "string")
* @ORM\DiscriminatorMap({"two_wheeler" = "TwoWheeler", "four_wheeler" = "FourWheeler"})
* @ORM\Table(name = "vehicle")
abstract class Vehicle
{
protected $id;
...
}
TwoWheeler должен быть помещен в один стол, а FourWheeler в другой стол. Для этого я создаю две модели с поведением SINGLE_TABLE.
* @ORM\Entity()
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name = "type",type = "string")
* @ORM\DiscriminatorMap({"bicycle" = "Bicycle", "motorcycle" = "Motorcycle"})
* @ORM\Table(name = "two_wheeler")
abstract class TwoWheeler extends Vehicle
{
}
И то же самое для квадроцикла
* @ORM\Entity()
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name = "type",type = "string")
* @ORM\DiscriminatorMap({"car" = "Car", "truck" = "Truck"})
* @ORM\Table(name = "four_wheeler")
abstract class FourWheeler extends Vehicle
{
}
И, наконец, бетонные элементы
Машина
* @ORM\Entity()
abstract class Car extends FourWheeler
{
...
}
Велосипед
* @ORM\Entity()
abstract class Bicycle extends TwoWheeler
{
...
}
и так далее ...
Проблема:
Doctrine не создаст этот шедевр наследования ... я думаю, у него есть проблемы с SINGLE_TABLE, расширяющим модель типа JOINED
Если я позволю сгенерировать doctrine migrations или doctrine schema, будет создана таблица vehicle, но не таблица two_wheeler и four_wheeler.
Я ожидаю, что таблица транспортных средств суммирует по крайней мере все идентификаторы транспортных средств (и общие свойства), а также таблицы four_wheeler и two_wheeler с определенными свойствами.
Подобный пост был 10 месяцев назад
Доктрина: наследование SINGLE_TABLE расширяется от наследования JOINED, возможно ли это?
Но никто не ответил
В чем проблема? Как я могу это решить? Есть ли более чистое решение?
Спасибо
Давайте на мгновение проигнорируем наиболее конкретные классы (Car, Truck, Bicycle и Motorcycle) и сделаем TwoWheeler и ForWheeler неабстрактными. doctrine теперь создает таблицы?
@ Эдвин, да, ты прав ... извини, это была опечатка. Я отредактировал свой пост.
@JovanPerovic Нет, результат тот же. Если я добавлю таблицы вручную, доктрина захочет ее отбросить.
Я предлагаю не использовать здесь наследование, а использовать черты для общих элементов, как описано, например, здесь: sitepoint.com/using-traits-doctrine-entities Избегайте слишком изощренного наследования сущностей, это только вызовет проблемы.
@LBA - дело не только в наличии общих свойств и методов для нескольких классов, что было бы действительно легко, используя черты ... но, например, для использования администратора сонаты вы можете легко установить родительский класс (FourWheeler) для администратора и управлять их подклассами (Автомобиль, Грузовик) в одном экземпляре администратора ... нет простого способа добиться этого путем введения двух дополнительных типов объектов ... еще один пример: если я просто хочу иметь идентификаторы всех транспортных средств в базе данных, у меня есть запросить n репозиториев и объединить их вместе ... на мой взгляд, слишком сложно: /
затем используйте только одно объединенное наследование и создайте свой собственный отдельный столбец (столбцы), установив имя класса (или любой другой идентификатор), чтобы иметь возможность запрашивать ваши данные. поверьте мне, мы сделали всевозможные наследования и даже некоторые комбинации, но в какой-то момент Doctrine сдалась (что совершенно нормально)
Хм, хорошо, если это действительно единственное решение, которое не позволяет смешивать оба типа, я сделаю это и подумайте, какой вид (single_table, connected) является меньшим злом






разве аннотация
@InheritanceType("SINGLE_TABLE")? согласно doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/…, и вы пропустите/**и*/