2013-08-27 26 views
1

我在DB複合主鍵一些表組合鍵的表,見下圖:生成ID鍵與使用Doctrine2和Symfony2的

Tables with composite keys

正如你在這種情況下,看到的是interestklists哪些有他們自己的id但也有kuser也是關鍵。 Doctrine docs表示,它們支持組合鍵中的幾乎所有用例,但每個使用組合鍵的實體都不能使用「ASSIGNED」以外的ID生成器。這意味着在調用EntityManager#persist($ entity)之前,ID字段必須設置其值。當我嘗試定義任何有關我有一個錯誤的表的實體,因爲教義不允許有這樣的:

/** 
    * @ORM\Id 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\Id  
    * @ORM\ManyToOne(targetEntity="UserBundle\Entity\User", inversedBy="users")  
    * @ORM\JoinColumn(name="kuser", referencedColumnName="id") 
    */ 
    protected $kuser; 

我知道,我可以用生命週期回調,但不要運行一些代碼不知道如何或在哪裏,所以我需要一些幫助,任何人都可以告訴我或指出我在正確的道路?

+0

爲什麼你需要id和kuser來複合? AutoIncremented ID已經是唯一的了。爲什麼要將kuser添加到組合中?只需從kuser中刪除ORM \ Id。 – Cerad

+0

@Cerad因爲它也需要一個KEY,我不能刪除 – Reynier

+0

kuser仍然可以是一個關鍵。它只包含kuser.id中的任何內容,這也是唯一的。在堅持的過程中,學說將爲你設置它。學說也會產生一個索引,並照顧級聯。如果需要,你也可以給它一個獨特的約束。我想你可能已經過分地混淆了複合關鍵路徑。在Doctrine 2中真正看到它的唯一時間是生成的ManyToMany表中沒有附加屬性。 – Cerad

回答

2

回到基本。我建議這裏開始的:http://docs.doctrine-project.org/en/latest/reference/association-mapping.html

class KUser 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

class Interest 
{ 
     /** 
     * @ORM\Id 
     * @ORM\Column(name="id", type="integer", nullable=false) 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     protected $id; 

     /**  
     * @ORM\ManyToOne(targetEntity="UserBundle\Entity\KUser")  
     * @ORM\JoinColumn(name="kuser_id", referencedColumnName="id") 
     */ 
     protected $kuser; 

這是所有你需要建立利益和K用戶之間的單向ManyToOne關係。如果您需要它雙向然後添加一個$interests屬性到KUser並將inversedBy設置爲Interest.kuser

請確保您在繼續之前瞭解簡單的關係。

如果鏈接表沒有附加屬性,Doctrine將自動生成ManyToMany鏈接表。您的KUserHasKLists確實有其他屬性。因此,您需要將其設爲實體,然後使用ManyToOne關係鏈接其他表。儘管在技術上你可能仍然在這裏使用複合鍵,但是定義一個自動增量主鍵要容易得多。

class KUserHasKLists 
{ 
     /** 
     * @ORM\Id 
     * @ORM\Column(name="id", type="integer", nullable=false) 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     protected $id; 

     /**  
     * @ORM\ManyToOne(targetEntity="UserBundle\Entity\KUser")  
     * @ORM\JoinColumn(name="kuser_id", referencedColumnName="id") 
     */ 
     protected $kuser; 

     /**  
     * @ORM\ManyToOne(targetEntity="UserBundle\Entity\KList")  
     * @ORM\JoinColumn(name="klist_id", referencedColumnName="id") 
     */ 
     protected $klist; 

但是,再次,從一個簡單的關係開始,並確保你明白髮生了什麼。如果您對phpunit感到滿意,請自己做一些功能測試。如果沒有,請自己創建一個Symfony命令,以便您可以從命令行嘗試這些東西。