Symfony4扩展实体未将“实体”列添加到数据库架构

时间:2019-04-02 09:01:54

标签: symfony doctrine

我正在开发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应该都可以拥有它的实例。

2 个答案:

答案 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;
}