【问题标题】:Symfony4 extending entity does not add Entity column to database schemaSymfony4 扩展实体不会将实体列添加到数据库模式
【发布时间】:2019-04-02 09:01:53
【问题描述】:

我正在开发 symfony 4.2 应用程序。我有实体 Meal 和 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 都应该可以拥有它的实例。

【问题讨论】:

    标签: symfony doctrine


    【解决方案1】:

    menu_id 列已存在于餐中

    /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Menu", inversedBy="meals")
         */
        protected $menu;
    

    OrderItem 类不需要仅仅因为它已经是餐的子类。 此外,您不需要将所有属性从 Meal 复制到 OrderItem。 你可以在这里查看php extends

    【讨论】:

    • 我需要在我的数据库表中有该字段
    【解决方案2】:

    我有同样的问题。我用 Trait 代替了继承,问题就解决了。

    你的班级会是这样的

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多