2011-07-01 104 views
3

表的訪問關係,我有一個繼承類如下所示:與繼承

Relations

正如你可以很容易地看到用戶,建築和酒店有地址(不止一個)和地址表保持在其列中的所有者的ID。

  1. 是我的邏輯是否正確?
  2. 假設我想獲取id爲2的用戶(或建築物或賓館)的地址;我必須運行一個DQL語句(以及如何?)或者我可以通過find()函數沒有DQL嗎?

如果你舉例,因爲Doctrine文檔沒有多大幫助,我會很高興。

謝謝。

編輯:用戶,建築物和酒店只是象徵性的名稱,這就是爲什麼他們可以有多個地址,否則建築物和酒店只有一個地址。

編輯2:我想,我不能讓自己清楚,當我談到的類表繼承我的意思是實體類有鑑別列

/** 
* ... 
* 
* @DiscriminatorColumn(name="classname", type="string") 
* @DiscriminatorMap({"Entities\users" = "Entities\users", 
* "Entities\buildings" = "Entities\buildings"}) ... etc 
*/ 

每個子類是有關具有外鍵關係的父(實體)作爲「id」。但當然,教義已經爲我創造了這種關係。

回答

0

所以,你已經有了一個被稱爲「實體」父類,它有子類「用戶」,「建設」和「酒店」。

你的「實體」的實體應該有一個一對多的關係解決的問題。讓我們想象一下它看起來像這樣,在你的實體定義:

/** 
* @OneToMany(targetEntity="Address", mappedBy="whose" 
*/ 
protected $addresses; 

這是一個比較或多或少精細的辦法,但使用繼承的是一個有點臭。

然後,如果你想遍歷地址,從內部用戶,大廈或酒店:

foreach($this->addresses as $address){ 
    //do something with adderess 
} 

是否回答你的問題?

1

通常一個地址是一個典型的value object。值對象通常與合成值對象的實體一起存儲,因此它既不關係也不關於類表繼承。如果您的域名另有說明(例如,你可以做一些與你的地址,這意味着),他們可能是一個實體,比實體Hotel持有某實體Address(在堅持:M關係表)和實體Building持有和Address太(在不同的n:m關係表)。

如果你走的價值對象路線,事情是不同的。你會以及存儲與Building實體地址與Hotel實體(如你將與其他價值的物品做到這一點可以說,它是MoneyEmailPassword)。所以你根本不需要關係,只需要更多的領域。Doctrine 2的問題是,它不支持Component mapping。組件映射將用於很好地存儲值對象。牛逼完成同樣的事情有原則2,你會實現一個@prePersist@postLoad處理這樣的:

class Hotel 
{ 
    private ; 

    /** These fields are persisted */ 

    /** @Column(type=string) */ 
    private $addressStreet; 
    /** @Column(type=string) */ 
    private $addressCity; 
    /** @Column(type=string) */ 
    private $addressZip; 
    /** @Column(type=string) */ 
    private $addressCountry; 

    /** @prePersist */ 
    public function serializeValueObjects() 
    { 
     $this->addressStreet = ->address->getStreet(); 
     $this->addressCity = ->address->getCity(); 
     $this->addressZip = ->address->getZip(); 
     $this->addressCountry = ->address->getCountry(); 
    } 


    public function unserializeValueObjects() 
    { 
     $this->address = new Address(->addressStreet, ->addressCity, ->addressZip, ->addressCountry); 
    } 
} 

當你需要序列在不同的地方/反序列化Address值對象,你可能要提取的序列化代碼成爲一個分離的類。

+0

如果每個對象都保留自己的街道,國家,郵編等,這不會產生任何好處。這與Class Table繼承無關。我編輯問題以更好的方式解釋它,你可能想看看。不管怎麼說,還是要謝謝你。 – ufucuk

1
 
/** 
* 
* @Entity 
* @Table(name="proposaltemplate") 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="entitytype", type="string") 
* @DiscriminatorMap({"proposal" = "ProposalTemplate","page" = "PageTemplate"}) 
* 
*/ 

abstract class AbstractProposalTemplate 
{ 
    /** 
    * 
    * @var integer 
    * @Id 
    * @Column(type="integer") 
    * @generatedValue(strategy="AUTO") 
    * 
    */ 
    private $id; 
} 

next 

@Entity 

class ProposalTemplate extends AbstractProposalTemplate 
{ 

     @Id 
     @Column(type="integer") 
     @generatedValue(strategy="AUTO") 


    private $id; 

} 
next another class 

    @Entity 

class PageTemplate extends AbstractProposalTemplate 
{ 
    /** 
    * 
    * @var integer 
    * @Id 
    * @Column(type="integer") 
    * @generatedValue(strategy="AUTO") 
    * 
    */ 
    private $id; 
}