假设我有一个可以有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 不存在。
这是有道理的,但我该如何处理这个问题呢?是否禁止具有复合主键的表在其上具有关联?
答案 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_id
和id
,你需要手动指定(我正在制作一些假设pouet
是Offer
类的唯一值。
编辑:根据您的评论,我在Composite Primary Key的Doctrine Project网站上找到了一个教程。实体关系的一个键为mappedBy
,另一个为indexBy
。希望有所帮助。