2014-11-03 146 views
4

我从现有的数据库中实现了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; 

但我得到一个错误:

作为另一个实体'ExempleBundle \ Entity \ Entite2#entite1'的主键的一部分,无法将实体'ExempleBundle \ Entity \ Entite1'映射为复合主键。

如何妥善处理这种关联关系与学说

我试图以此为榜样,但我不明白:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html#use-case-1-dynamic-attributes

你能不能给两个实体的例子有类似的情况下,特别是在在这种情况下如何进行联合。

回答

-1

Doctrine2不管理外国组合键来引用的实体,其复合主键

其中Doctrine2管理正确复合主键的情况下,主要是:

  • 一对多:相关联的实体(ArticleAttributes)用作主键,被引用实体(Artile)的主键和其他自身字段(属性)

Article(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

希望这有助于。

+0

看来你是错的学说的组合键管理协会。这并不麻烦。 麻烦的是,用于关联的密钥似乎不能同时作为PK的一部分写入错误:'不能将实体'...'映射为复合主键作为主键的一部分另一个实体'...'。 有这种情况的丑陋解决方案: http://stackoverflow.com/questions/19008582/doctrine2-map-entities-with-composite-foreign-keys-in-the-the-composite-primary-keys – zeliboba 2015-04-10 13:09:32

+0

请正确阅读我的答案,我从来没有说过,“学说[不]通过组合键管理关联” 相反,我说的是Doctrine2在某些情况下正确地管理复合主键。 – 2015-04-17 14:03:13

+0

这可能吗? – SayDevNet 2015-04-22 07:32:12

2

我发现了一个解决问题的工作区域,它通过定义一个单独的外键, 将原始外键列用作连接列。

/** @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; 
+0

良好管理谢谢,但如果我设置(例如)$ property1,$ property2和$ property3,这些字段将变为空。它删除$ foreignObject后工作正常。有两种方法可以使用吗? – schellingerht 2016-12-05 16:06:46

1

这是一个可行的例子:

<?php 

namespace Project\WorkflowBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="opinion") 
*/ 
class Opinion 
{ 
    /** 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="\Project\WorkflowBundle\Entity\Comision_Proyecto", inversedBy="opiniones") 
    */ 
    protected $comision; 
    /** 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="\Project\WorkflowBundle\Entity\Persona", inversedBy="opiniones") 
    */ 
    protected $persona; 
    /** 
    * @ORM\OneToMany(targetEntity="\Project\WorkflowBundle\Entity\Comentario", mappedBy="opinion") 
    */ 
    protected $comentarios; 
} 

其他类:

<?php 


namespace Project\WorkflowBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="comentario") 
*/ 
class Comentario 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue 
    */ 
    protected $id; 
    /** 
    * @ORM\Column(type="boolean") 
    */ 
    protected $privado; 
    /** 
    * @ORM\ManyToOne(targetEntity="\Project\WorkflowBundle\Entity\Opinion") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="comision_id", referencedColumnName="comision_id"), 
    * @ORM\JoinColumn(name="persona_id", referencedColumnName="persona_id") 
    * }) 
    */ 
    protected $opinion; 
}