Symfony2在父级中使用一个字段,在扩展实体中使用不同的注释/映射

时间:2013-07-15 12:52:10

标签: symfony orm doctrine-orm annotations mapping

我遇到了问题,并会感谢专家的帮助。

我有实体:

产品

// src/Acme/DemoBundle/Entity/Product.php

/**
 * @ORM\Entity
 * @ORM\Table(name="products")
 */
class Product
{
   ...
   /**
     * @ORM\Column(name="file_uuid", unique=true, nullable=true)
     * @ORM\OneToOne(targetEntity="Acme\DemoBundle\Entity\File")
     * @ORM\JoinColumn(name="file_uuid", referencedColumnName="uuid")
     *
     */
    protected $file;

    /**
     * @ORM\OneToMany(targetEntity="Acme\DemoBundle\Entity\Image", mappedBy="product")
     *
     * @var ArrayCollection Collection of Image entities
     */
    protected $images;
    ...
}

文件

// src/Acme/DemoBundle/Entity/File.php

/**
 * @ORM\Entity
 * @ORM\Table(name="product_files")
 */
class File
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue
     */
    protected $id;

    /**
     * @ORM\Column(name="uuid", type="string", length=64)
     */
    protected $uuid;

    /**
     * @ORM\Column(name="product_id")
     */
    protected $product;

    ...
}

图像

// src/Acme/DemoBundle/Entity/Image.php

/**
 * @ORM\Entity
 * @ORM\Table(name="product_images")
 */
class Image extends File
{

    /**
     * @ORM\ManyToOne(targetEntity="Acme\DemoBundle\Entity\Product", inversedBy="images")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
     */
    protected $product;

    /**
     * @ORM\Column(name="extension", type="string")
     */
    protected $extension;

    ...
}

我的sql正确无误:

product_files
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| uuid        | varchar(64)  | NO   |     | NULL    |                |
| product_id  | varchar(255) | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+


product_images
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| uuid        | varchar(64)  | NO   |     | NULL    |                |
| product_id  | varchar(255) | NO   |     | NULL    |                |
| extension   | varchar(64)  | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

但是当我运行我的应用程序时,我遇到了错误:

An exception has been thrown during the rendering of a template ("Notice: Undefined index: product in .../vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 1575") in AcmeDemoBundle:Product:edit.html.twig at line 24.

我哪里错了?

在edit.html.twig中,我只想显示产品图片。

我可以避免此问题从 $ product 文件实体注释中删除:

@ORM\Column(name="product_id")

但是,在 doctrine:schema:update 之后,我在 product_images 表中隐藏了 product_id 字段。

我想要的是什么:

  • 每个产品只有一个文件
  • 每个产品有多个图像

1 个答案:

答案 0 :(得分:0)

好的,我明白了。

问题在于无法覆盖关系,因为我试图对我的数据库进行非规范化。

因此,为了实现我想要的东西,教义给了我3种正确的方法:

  • 创建一个不是实体的超类,拥有我需要的所有属性,然后创建实体从中扩展,描述我需要的所有关系;
  • 创建“单个表”映射。当你可以将1个表用于具有鉴别器列的多个实体时,这将确定应该加载哪个实体;
  • 和'映射超类',您将拥有一个基本字段集基表,扩展表只有扩展字段和一个额外字段ID,它将引用基表;

希望有人能避免花时间找到同样的事情。

链接: