2014-11-03 147 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; 
}