0

我是 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 创建具有两个对象的唯一引用?

4

1 回答 1

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;
于 2013-07-04T13:34:18.610 回答