2011-11-15 202 views
0

Im新的Symfony2(在幾年前使用過symfony 1.x)和Im試圖理解如何處理與Doctrine2的實體關係。 (可以肯定的是,如果Symfony2書中有更多的關係示例,而不是簡單地指向Doctrine2文檔,那將會很不錯:-)Doctrine2實體關係

所以我有一個簡單的產品實體,我想要涉及多個類別(即單個產品可以在多個類別中)。從表面上看,這看起來像是一對多的關係,但是我認爲像這樣的關係可以通過數據庫中的連接表來完成。所以Im做這樣的事情,而不是:

class Product 
{ 
    .... 

    /** 
    * @ORM\ManyToMany(targetEntity="Category"); 
    **/ 
    private $categories; 

} 

做一個架構更新的數據庫確實創建連接表預期。但林想知道是否我錯了,使這是一個多對多,而不是?我想我在問最佳實踐以及你如何做到這一點?任何人都可以提供建議和/或提供示例嗎?

回答

2

您的句子「單一產品可以在多個類別」是真實的,但這也是真實的:「多個產品可以有多個類別」。那是因爲你沒有使用好的句子,它們是:

  • 「類別可以有許多產品」
  • 「一個產品可以有許多類別」

這意味着你有多對多的關係。

如果是

  • 「類別可以有很多產品
  • 「一個產品只能有一個

然後你就會有一個一對多和多對一的關係。

+0

感謝澄清 - 這是有道理的。 – Eno

0

如果你想有一個多對多的關係,你需要一箇中間表

class Product 
{ 
    /** 
    * @ManyToMany(targetEntity="Categories") 
    * @JoinTable(name="Product_Category", 
    *  joinColumns={@JoinColumn(name="product_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@JoinColumn(name="Category_id", referencedColumnName="id")} 
    *  ) 
    */ 
    private $categories; 
} 
+1

您不需要指定連接表或列,除非您不喜歡Doctrine2自動選擇的(明智)默認值。 (請參閱http://www.doctrine-project.org/docs/orm/2.0/en/reference/association-mapping.html#mapping-defaults) – Eno

+0

嗯,但我認爲更清楚地看到關係是使。 :) – SERPRO

+1

愛註釋,但它會在閱讀代碼時感到分心:-) – Eno