我正在开发symfony 4.2应用程序。我有实体餐和OrderItem。 OrderItem应该具有所有Meal实体属性+很少拥有。问题出在ManyToOne关系列上。它不会添加到order_item表中。
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/inheritance-mapping.html 我尝试遵循“类表继承”和“映射超类”。 “映射的超类”中的示例未将$ mappedRelated1添加到EntitySubClass。 “类表继承”中的示例从Meal类中删除了所有其他扩展字段,并在Meal表中添加了某种“ dtype”列。
/**
* @ORM\Entity(repositoryClass="App\Repository\OrderItemRepository")
*/
class OrderItem extends Meal
{
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Order", inversedBy="orderItems")
*/
private $order;
/**
* @ORM\Column(type="integer")
* @Assert\NotBlank
* @Assert\Type("string")
*/
private $amount;
}
/**
* @ORM\Entity(repositoryClass="App\Repository\MealRepository")
*/
class Meal
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank
* @Assert\Type("string")
*/
protected $name;
/**
* @ORM\Column(type="float")
* @Assert\NotBlank
* @Assert\Type("float")
*/
protected $price;
/**
* @ORM\Column(type="string", length=255)
* @Assert\Image(
* mimeTypes={"image/jpeg", "image/png"}
* )
*/
protected $image;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Menu", inversedBy="meals")
*/
protected $menu;
}
我希望“ order_item”表中具有“ menu_id”列,这与菜单实体有关。
我知道我可以将Meal中的所有属性复制到OrderItem,但这听起来不正确。
编辑:
Meal和OrderItem应该都可以拥有它的实例。
答案 0 :(得分:0)
menu_id列
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Menu", inversedBy="meals")
*/
protected $menu;
OrderItem类不需要仅仅因为它已经是餐的子类。 另外,您不需要将所有特性从Meal复制到OrderItem。 您可以在此处查看php extends
答案 1 :(得分:0)
我有同样的问题。我用特质代替继承,问题解决了。
您的课程将是这样
trait MealInfoTrait
{
/**
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank
* @Assert\Type("string")
*/
protected $name;
/**
* @ORM\Column(type="float")
* @Assert\NotBlank
* @Assert\Type("float")
*/
protected $price;
/**
* @ORM\Column(type="string", length=255)
* @Assert\Image(
* mimeTypes={"image/jpeg", "image/png"}
* )
*/
protected $image;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Menu", inversedBy="meals")
*/
protected $menu;
}
然后,更改您的用餐等级
/**
* @ORM\Entity(repositoryClass="App\Repository\MealRepository")
*/
class Meal
{
use MealInfoTrait;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
protected $id;
}
对您的OrderItem类执行相同的操作。不要忘记为数据库添加ID。
/**
* @ORM\Entity(repositoryClass="App\Repository\OrderItemRepository")
*/
class OrderItem
{
use MealInfoTrait;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Order", inversedBy="orderItems")
*/
private $order;
/**
* @ORM\Column(type="integer")
* @Assert\NotBlank
* @Assert\Type("string")
*/
private $amount;
}