#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;
}