Doctrine объединенное наследование в сочетании с наследованием одной таблицы

Я хочу, чтобы в моей модели была следующая ситуация

У меня есть разные типы конкретных транспортных средств, такие как 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, возможно ли это?

Но никто не ответил

В чем проблема? Как я могу это решить? Есть ли более чистое решение?

Спасибо

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

Edwin 01.08.2018 12:20

Давайте на мгновение проигнорируем наиболее конкретные классы (Car, Truck, Bicycle и Motorcycle) и сделаем TwoWheeler и ForWheeler неабстрактными. doctrine теперь создает таблицы?

Jovan Perovic 01.08.2018 12:21

@ Эдвин, да, ты прав ... извини, это была опечатка. Я отредактировал свой пост.

Jim Panse 01.08.2018 12:49

@JovanPerovic Нет, результат тот же. Если я добавлю таблицы вручную, доктрина захочет ее отбросить.

Jim Panse 01.08.2018 12:52

Я предлагаю не использовать здесь наследование, а использовать черты для общих элементов, как описано, например, здесь: sitepoint.com/using-traits-doctrine-entities Избегайте слишком изощренного наследования сущностей, это только вызовет проблемы.

LBA 01.08.2018 14:03

@LBA - дело не только в наличии общих свойств и методов для нескольких классов, что было бы действительно легко, используя черты ... но, например, для использования администратора сонаты вы можете легко установить родительский класс (FourWheeler) для администратора и управлять их подклассами (Автомобиль, Грузовик) в одном экземпляре администратора ... нет простого способа добиться этого путем введения двух дополнительных типов объектов ... еще один пример: если я просто хочу иметь идентификаторы всех транспортных средств в базе данных, у меня есть запросить n репозиториев и объединить их вместе ... на мой взгляд, слишком сложно: /

Jim Panse 01.08.2018 14:09

затем используйте только одно объединенное наследование и создайте свой собственный отдельный столбец (столбцы), установив имя класса (или любой другой идентификатор), чтобы иметь возможность запрашивать ваши данные. поверьте мне, мы сделали всевозможные наследования и даже некоторые комбинации, но в какой-то момент Doctrine сдалась (что совершенно нормально)

LBA 01.08.2018 14:13

Хм, хорошо, если это действительно единственное решение, которое не позволяет смешивать оба типа, я сделаю это и подумайте, какой вид (single_table, connected) является меньшим злом

Jim Panse 01.08.2018 14:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
8
945
0

Другие вопросы по теме