2013-06-27 18 views
2

如何映射和實現Setters/Getters以及一個實體的註釋,該註解將信息放在多個表中?symfony2/Doctrine具有多個表格的實體

例如,我們有這些表:

  • 產品(ID,姓名,的ctime)
  • 價格(ID,價格)
  • 銷售(ID,數量)
  • 買(ID,量)
  • 收入(ID,收入)
  • MarketShare公司(ID,共享)
  • 股票(ID,數量)
  • LastEdit(ID,日期時間)

它們都涉及通過ID。 產品實體是這樣的:

class Product { 
    private $id; 
    private $name; 
    private $price; 
    private $sold; 
    private $bought; 
    private $revenue; 
    private $share; 
    private $stock; 
    private $lastEdit; 
} 

謝謝

回答

1

所有屬性,將有隻有一個值,你不必使用單獨的表(實體)爲,使用簡單的屬性(變量)和app/console doctrine:generate:entities將創建所有必需的獲取者和設置者。

如果您仍然需要(出於某種原因)在所有情況下爲所有屬性創建實體(價格,銷售額,收入...)並配置OneToOne或OneToMany(取決於您是否想要對該財產具有單一價值或多個價值)產品和相關實體之間的鏈接。

例如:

class Product { 
    ... 

    /** 
    * @var \Doctrine\Common\Collections\ArrayCollection 
    * @ORM\OneToMany(targetEntity="Price", mappedBy="product") 
    */ 
    protected $prices; 

    /** 
    * @var Stock 
    * @ORM\OneToOne(targetEntity="Stock", mappedBy="product") 
    */ 
    protected $stock; 
    ... 
} 

現在,OneToOne關係的股票實體:

class Stock { 
    ... 

    /** 
    * @var integer 
    * @ORM\Column(name="amount", type="integer") 
    */ 
    protected $amount; 

    /** 
    * @var Product 
    * @ORM\OneToOne(targetEntity="Product", inversedBy="stock") 
    */ 
    protected $product; 

    ... 
} 

而且價格實體多對一的關係:

class Price { 
    ... 

    /** 
    * @var float 
    * @ORM\Column(name="price", type="float") 
    */ 
    protected $price; 

    /** 
    * @var Product 
    * @ORM\ManyToOne(targetEntity="Product", inversedBy="prices") 
    */ 
    protected $product; 

    ... 
} 

正如我前面提到app/console doctrine:generate:entities將根據配置創建所有必需的獲取者和設置者。

注意:請記住,使用此配置,具有OneToOne關係的子實體將使用附加字段更新 - product_id。 OneToMany不會改變你的模式。

希望幫助

乾杯

+0

太感謝你了,它的確是有幫助的。在這種方法中,教條會對獲取信息提出太多疑問?第二個問題:如果我堅持一個沒有價格的對象,它會在價格表中創建一個空行嗎? – Arsham

+0

由於產品中的價格屬性是OneToMany關係,因此當您將產品保存爲空價格列表時,數據庫中將不會創建任何內容。另一方面,如果您選擇爲其他實體(屬性)創建OneToOne關係,則必須手動或使用級聯在構造函數中創建它們。如果你不會這樣訪問這些屬性會拋出異常。稍後訪問它們將執行額外的數據庫查詢。如果你不想要這個,那麼就像我之前建議的那樣使用常規屬性(列)。 – sickelap

相關問題