Наследование таблиц классов Doctrine и игнорирование свойств

#symfony #doctrine-orm #sylius

#symfony #doctrine-orm #sylius

Вопрос:

Первоначально я разместил этот вопрос здесь: https://github.com/doctrine/DoctrineBundle/issues/297

У меня есть следующая иерархия сущностей, MyProduct является родительской сущностью, отображаемой через наследование таблицы классов :

 SyliusProduct    # Mapped superclass containing the 'options' association mapping
–- MyProduct     # Mapped superclass that should override the association (Head of CTI)
---- MyProduct1  # Ultimate children (entities)
---- MyProduct2
---- MyProduct3
---- MyProduct4
  

SyliusProduct имеет связь «многие ко многим» с объектом Option, который отображается в отображении SyliusProduct .

Я не могу изменить отображение SyliusProduct (это часть поставщика Symfony).

При создании схемы doctrine хочет сгенерировать таблицы sylius_product_options для каждого конечного дочернего элемента, который выдает исключение «tables exists».

Есть ли способ либо:

  • сопоставить ассоциацию на конечном дочернем уровне, создав 4 разные таблицы (и указав разные имена таблиц)?
  • сопоставить это на уровне MyProduct?
  • просто игнорировать ассоциацию?

Комментарии:

1. Вы создаете новую сущность для каждого продукта?

2. Да, MyProduct[1,2,3,4] являются объектами, которые расширяют MyProduct .

3. Ваша проблема в том, что Product объект / таблица должна содержать все ваши продукты в одном объекте / таблице, а не по одному продукту в каждом.

4. Да, это верно, и мой вопрос: «Возможно ли хранить субпродукты, используя наследование таблиц классов, сохраняя при этом ассоциацию «параметры» на уровне MyProduct?»

5. Мне кажется, что вы неправильно смотрите на базу данных. Почему вам нужно хранить каждый из продуктов в отдельном объекте, а не хранить их все в одной таблице? Что произойдет, если вы захотите добавить еще один продукт в будущем, вам нужно будет создать другую сущность и изменить наследование, чтобы оно соответствовало ей?

Ответ №1:

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

Вам также необходимо добавить карту дискриминатора в объект MyProduct для каждого подпродукта, например :

 <entity name="MyProduct" inheritance-type="SINGLE_TABLE">
    <discriminator-map>
        <discriminator-mapping value="pr1" class="MyProduct1"/>
        <discriminator-mapping value="pr2" class="MyProduct2"/>
        <discriminator-mapping value="pr2" class="MyProduct3"/>
    </discriminator-map>
    ...
</entity>
  

Если родительский сопоставленный суперкласс уже имеет сопоставление параметров «многие ко многим», вам не нужно переопределять его в вашей сущности MyProduct.

Таким образом, объекты MyProduct1-4 будут наследоваться от MyProduct, который сам наследует от SyliusProduct все в SINGLE_TABLE, поэтому doctrine не будет пытаться создавать разные таблицы с одинаковыми именами для каждого субпродукта.