如何使用Doctrine2处理复合密钥实体的关联?

时间:2011-08-03 12:50:30

标签: doctrine-orm symfony

假设我有一个可以有1-n范围的优惠。 你立刻想到,“把一个offer_id放在范围内”。

但我的商品有一个复合主键(由两个字段组成)。没有AUTOINCREMENT id列。

Doctrine2文档没有详细说明这个特定情况,这是我的实体:

<?php
use Doctrine\ORM\Mapping as ORM;
/**
 * @ORM\Table()
 * @ORM\Entity
 */
class Offer
{
    /**
     * @var Site $site
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Site")
     * @ORM\JoinColumn(name="site_id", referencedColumnName="id")
     */
        private $site;

    /**
     * @var string $pouet
     * @ORM\Id
     * @ORM\Column(name="pouet", type="string", length=255)
     */
    private $pouet;
}

<?php
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="RangeItem")
 * @ORM\Entity
 */
class Range
{
    /**
     * @todo This is test code only do not push me :-)
     * @var ArrayCollection
     * @ORM\ManyToOne(targetEntity="Offer")
     */
    private $offers;
}

我得到了这个错误:

  

[学说\ ORM \ ORMException]
  从中引用的列名id   Pouet \ MyBundle \ Entity \范围朝向Pouet \ MyBundle \ Entity \ Offer   不存在。

这是有道理的,但我该如何处理这个问题呢?是否禁止具有复合主键的表在其上具有关联?

2 个答案:

答案 0 :(得分:3)

我认为解决方案是镜像外键(FK)的主键(PK)。 I.E.对于构成PK(site,pouet)的每个列,您需要在相关实体上拥有相同的列。

您可以对复合FK的每个部分使用Item:{ test_id:results[0].id, name:results[0].name, result:results[0].result } 注释(或YAML / XML中的等效注释)和JoinColumns来执行此操作:

JoinColumn

我希望这可能有助于那些仍在努力解决这个问题的人。

答案 1 :(得分:1)

您应该能够在@JoinColumn类中使用Range注释来指定要使用的ID:

/**
 * @ORM\ManyToOne(targetEntity="Offer")
 * @ORM\JoinColumn(name="offer_pouet", referencedColumnName="pouet")
 */
private $offers;

因为@JoinColumn的默认值(如果你没有指定它们)分别是offer_idid,你需要手动指定(我正在制作一些假设pouetOffer类的唯一值。

编辑:根据您的评论,我在Composite Primary Key的Doctrine Project网站上找到了一个教程。实体关系的一个键为mappedBy,另一个为indexBy。希望有所帮助。