Symfony2 ORM FK Composite

时间:2013-07-04 11:19:04

标签: symfony orm doctrine-orm composite-key composite-primary-key

我是Symfony2和Doctrine 2 ORM的新手,然后我遇到了复合FK关联的问题。

虽然单个自动增量ID的关联OneToMany-ManyToOne运行良好,但是我通过复合PK获得了相同类型关联的许多麻烦。

我想做的是一个反映下面的shema的实体结构。

http://imageshack.us/photo/my-images/9/z07m.jpg(抱歉,我无法在帖子中插入图片)

,其中

prd_product_data.product_id
prd_product_data.language_id

组合'prd_product_data'的PK 和

prd_product_image.pdoduct_id
prd_product_image.language_id

组成与'prd_product_data'表相关联的FK。

以下

prd_product_image.pdoduct_id
prd_product_image.language_id
prd_product_image.file_image_id

一起制作'prd_product_image'的PK。

我读到了Doctrine 2.1及以上,本机支持组合的PK - FK关联,但是很少有例子。此外,在网上冲浪,我发现只是分散的类似情况的碎片,但没有任何用处。 现在的主要问题是,我无法为这两个id创建一个唯一对象,例如这样一个唯一的id。

例如......

实体的快照 ProductData ,其中“产品语言应构成同一个对象:

/**
  *
  * @ORM\OneToMany(targetEntity="ProductImage", mappedBy="product")
  */
 protected $products_Pimgs;

 /**
  *
  * @ORM\OneToMany(targetEntity="ProductImage", mappedBy="language")
  */
 protected $products_Limgs;

实体的快照 ProductImage 其中* product_id *和* language_id *构成实体ProductData的FK:

    /**
     *
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="ProductData", inversedBy="products_Pimgs")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="product_id")
     */
    protected $product;

    /**
     *
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="ProductData", inversedBy="products_Limgs")
     * @ORM\JoinColumn(name="language_id", referencedColumnName="language_id")
     */

    protected $language;

    /**
     *
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="FileImage", inversedBy="files_images")
     * @ORM\JoinColumn(name="file_image_id", referencedColumnName="id")
     */
    protected $file_image;

从这些快照中可以看出,这些密钥是分开工作的。

最后,这是我的学说版本,取自作曲家:

"doctrine/orm": ">=2.2.3,<2.4-dev",

如何使用ORM创建带有两个对象的唯一引用?

1 个答案:

答案 0 :(得分:0)

阅读文档章节Composite Primary Keys


/**
  * @ORM\Id
  * @ORM\OneToMany(targetEntity="ProductImage", mappedBy="product")
  */
protected $products_Pimgs;

/**
 * @ORM\Id
 * @ORM\OneToMany(targetEntity="ProductImage", mappedBy="language")
 */
protected $products_Limgs;