Расширяющая сущность Symfony4 не добавляет столбец сущности в схему базы данных

#symfony #doctrine

#symfony #доктрина

Вопрос:

Я разрабатываю приложение symfony 4.2. У меня есть entity Meal и OrderItem. OrderItem должен иметь все свойства объекта Meal несколько собственных. Проблема связана со столбцом ManyToOne relationship. Он не добавляется в таблицу order_item.

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/inheritance-mapping.html Я попытался следовать «Наследованию таблицы классов» и «Сопоставленным суперклассам». Пример из «Сопоставленных суперклассов» не добавляет $mappedRelated1 к EntitySubClass . И пример из «Наследования таблицы классов» удаляет все остальные расширенные поля из класса Meal и добавляет некоторый столбец «dtype» в таблицу Meal.

 /**
 * @ORMEntity(repositoryClass="AppRepositoryOrderItemRepository")
 */
class OrderItem extends Meal
{
    /**
     * @ORMManyToOne(targetEntity="AppEntityOrder", inversedBy="orderItems")
     */
    private $order;

    /**
     * @ORMColumn(type="integer")
     * @AssertNotBlank
     * @AssertType("string")
     */
    private $amount;
}


/**
 * @ORMEntity(repositoryClass="AppRepositoryMealRepository")
 */
class Meal
{
    /**
     * @ORMId()
     * @ORMGeneratedValue()
     * @ORMColumn(type="integer")
     */
    protected $id;

    /**
     * @ORMColumn(type="string", length=255)
     * @AssertNotBlank
     * @AssertType("string")
     */
    protected $name;

    /**
     * @ORMColumn(type="float")
     * @AssertNotBlank
     * @AssertType("float")
     */
    protected $price;

    /**
     * @ORMColumn(type="string", length=255)
     * @AssertImage(
     *     mimeTypes={"image/jpeg", "image/png"}
     * )
     */
    protected $image;

    /**
     * @ORMManyToOne(targetEntity="AppEntityMenu", inversedBy="meals")
     */
    protected $menu;
}
  

Я ожидаю, что в таблице «order_item» будет столбец «menu_id», который будет иметь отношение к объекту Menu.

Я знаю, что мог бы скопировать все свойства из Meal в OrderItem, но это звучит неправильно.

Редактировать:

И Meal, и OrderItem должны иметь возможность иметь его экземпляр.

Ответ №1:

столбец menu_id уже существует в meal

 /**
     * @ORMManyToOne(targetEntity="AppEntityMenu", inversedBy="meals")
     */
    protected $menu;
  

Классу OrderItem не обязательно иметь только потому, что он уже является подклассом meal.
Также вам не нужно копировать все свойства из Meal в OrderItem.
вы можете проверить php extends здесь

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

1. Мне нужно иметь это поле в моей таблице базы данных

Ответ №2:

У меня была такая же проблема. Я использовал признак вместо наследования, и проблема была решена.

Ваш класс будет выглядеть следующим образом

 trait MealInfoTrait
{   
    /**
     * @ORMColumn(type="string", length=255)
     * @AssertNotBlank
     * @AssertType("string")
     */
    protected $name;

    /**
     * @ORMColumn(type="float")
     * @AssertNotBlank
     * @AssertType("float")
     */
    protected $price;

    /**
     * @ORMColumn(type="string", length=255)
     * @AssertImage(
     *     mimeTypes={"image/jpeg", "image/png"}
     * )
     */
    protected $image;

    /**
     * @ORMManyToOne(targetEntity="AppEntityMenu", inversedBy="meals")
     */
    protected $menu;
}
  

Затем измените класс Meal

 /**
 * @ORMEntity(repositoryClass="AppRepositoryMealRepository")
 */
class Meal
{
    use MealInfoTrait;

    /**
     * @ORMId()
     * @ORMGeneratedValue()
     * @ORMColumn(type="integer")
     */
    protected $id;
}
  

И сделайте то же самое с вашим классом OrderItem. Не забудьте добавить идентификатор для базы данных.

 /**
 * @ORMEntity(repositoryClass="AppRepositoryOrderItemRepository")
 */
class OrderItem
{
    use MealInfoTrait;

    /**
     * @ORMId()
     * @ORMGeneratedValue()
     * @ORMColumn(type="integer")
     */
    protected $id;

    /**
     * @ORMManyToOne(targetEntity="AppEntityOrder", inversedBy="orderItems")
     */
    private $order;

    /**
     * @ORMColumn(type="integer")
     * @AssertNotBlank
     * @AssertType("string")
     */
    private $amount;
}