Doctrine 复合主键外键

Say*_*Net 6 orm symfony doctrine-orm

我从现有数据库中实现了一个带有 Symfony 2 的 Web 应用程序。

我已经建立了一个实体,其主键由两个外键组成。

例子:

Entity1 具有复合主键:property1 (PK)、property2 (PK) Entity2 主键由两个外键组成:property1 (PK FK)、property2 (PK FK)、propriete3 (PK)

我不知道如何实现这个关联:

在 entity2 我做:

/** 
 * @ORM\ManyToOne (targetEntity = "Entity1") 
 * @ORM\JoinColumns ({
 *    @ORM\JoinColumn (name = "property1" referencedColumnName = "property1") 
 *    @ORM\JoinColumn (name = "property2" referencedColumnName = "property2") 
 *    @ORM\Id 
 * @}) 
 */ 
private $entity1; 
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

不可能将实体“ExempleBundle\Entity\Entite1”与复合主键映射为另一个实体“ExempleBundle\Entity\Entite2#entite1”的主键的一部分。

如何正确处理这种与 Doctrine 的关联

我试图按照这个例子,但我不明白:http : //docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html#use-case-1-动态属性

您能否举一个具有类似案例的两个实体的示例,尤其是在这种情况下如何进行连接。

小智 5

我找到了解决该问题的解决方法,即定义一个单独的外键,使用原始外键列作为连接列。

/** @Id @Column(...) */
protected $property1;
/** @Id @Column(...) */
protected $property2;
/** @Id @Column(...) */
protected $property3;

/**
 * @ManyToOne(targetEntity="Entity1")
 * @JoinColumns({
 *     @JoinColumn(name="property1", referencedColumnName="property1"),
 *     @JoinColumn(name="property2", referencedColumnName="property2")
 * })
 **/
protected $foreignObject;
Run Code Online (Sandbox Code Playgroud)


BAD*_*med -1

Doctrine2 不管理外部复合键来引用实体及其复合主键

Doctrine2正确管理复合主键的情况主要有:

  • OneToMany:关联实体(ArticleAttributes)使用引用实体(Artile)的主键和其他自身字段(属性)作为主键

文章(id、标题、...)、ArticleAttributes(#article_id、#attribute、值、...)

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html#use-case-1-dynamic-attributes

在您的情况下,您想要引用一个没有唯一标识符但有复合键的实体,Doctrine 不管理这种情况。关联实体类型只能有复合键。

一般来说,我避免在主要模型上使用复合键。我为关联类型模型保留了复合键。

因此,解决方案是为主模型 Entity1 使用主键

希望这可以帮助。