Doctrine orm 如何使用Doctrine2处理组合键实体上的关联?

Doctrine orm 如何使用Doctrine2处理组合键实体上的关联?,doctrine-orm,symfony,Doctrine Orm,Symfony,假设我有一个报价,可以有1-n范围。 你马上就会想,“把报价放在范围内” 但是我的报价有一个复合主键(由两个字段组成)。没有自动增量id列 Doctrine2文档并没有对这个特殊情况做太多说明,下面是我的实体: <?php use Doctrine\ORM\Mapping as ORM; /** * @ORM\Table() * @ORM\Entity */ class Offer { /** * @var Site $site * @ORM\Id

假设我有一个报价,可以有1-n范围。 你马上就会想,“把报价放在范围内”

但是我的报价有一个复合主键(由两个字段组成)。没有自动增量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;
}

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

/**
 * @ORM\ManyToOne(targetEntity="Offer")
 * @ORM\JoinColumn(name="offer_pouet", referencedColumnName="pouet")
 */
private $offers;
因为
@JoinColumn
的默认值,如果您不指定它们,将分别是
offer\u id
id
,您需要手动指定(我在这里假设
pouet
offer
类的唯一值)


编辑:根据您的评论,我在“条令”项目网站上找到了一个教程。实体关系的一个键为
mappedBy
,另一个键为
indexBy
。希望能有所帮助。

我认为解决方案是将主键(PK)镜像为外键(FK)。即,对于构成PK(站点、pouet)的每个列,您需要在相关实体上具有相同的列

您可以通过为复合FK的每个部分使用
JoinColumns
注释(或YAML/XML中的等效注释)和
JoinColumn
来实现这一点:

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

我希望这可能会帮助那些仍在这个问题上苦苦挣扎的人。

我有一个组合键,我的报价主键是$site和$pouet的组合。这就是为什么我不能使用referencedColumnName,当链接使用复合的.Thx时,PK没有列名,但这也不起作用。我仍然不知道如何在其他实体中引用我的对象。我正在认真考虑删除sexy复合键,改为使用一个简单的自动递增id(以及字段上的唯一索引)。您最好添加一个简单的自动递增id,或者另外,条令本身说复合密钥不是最好的。