2011-07-21 48 views
3

如何在Doctrine 2中使用Class Table Inheritance指定用於外鍵關係的列?例如,採取以下兩類:如何在Doctrine2中爲類表繼承指定外鍵列?

/** 
* @Entity 
* @InhertanceType("JOINED") 
* @DiscriminatorColumn(name="type", type="string") 
* @DiscriminatorMap("person" = "Person", "employee" = "Employee") 
*/ 
class Person 
{ 
    /** @Id */ 
    public $id; 

    /** @Column(type="string") */ 
    public $ssn; 
} 

/** @Entity */ 
class Employee 
{ 
    /** @Column(type="decimal") */ 
    public $salary; 
} 

有了這個,沿着學說這個有點希望的表結構:

CREATE TABLE `person` (
    `id` INT(11) NOT NULL auto_increment, 
    `ssn` VARCHAR(255) default NULL, 
    PRIMARY_KEY(`id`) 
) 

CREATE TABLE `employee` (
    `person_id` INT(11) NOT NULL, 
    `salary` DECIMAL(10,2) default NULL, 
    PRIMARY_KEY(`person_id`) 
) 
ALTER TABLE `employee` 
    ADD CONSTRAINT `person_fk` FOREIGN KEY (`person_id`) 
     REFERENCES `person` (`id`) ON DELETE CASCADE 

有指向person.id外鍵employee.person_id。但我怎麼能告訴教義哪些列使用?我假設person.id參考來自@Id註釋上Person類,但如果我想創建FK到person.ssn,而不是(這是可以想象的,因爲SSN自然是唯一的)。

如果我有一個遺留數據庫,employee.person_id被調用employee.p_id會怎樣呢?

+0

我認爲他們必須是相同的(子類具有相同的主鍵父母),我記得有的談這個是目前的限制。稍後會試着找到一個參考。 – Orbling

+0

謝謝。這聽起來很奇怪。我相信'doctrine orm:schema-tool:create'想創建一個以'employee.person_id'作爲外鍵,而不是'employee.id'的表。當我回來工作時我會檢查明天。 –

回答

2

首先,你缺少Employee類中定義的「擴展人」。

從我所知道的,當你正在做這種類型的繼承,理論使用主鍵在主類加入其他所有的表,它是預期的行爲。

當你做一個查詢,學說將加入所有的子表給家長,然後根據鑑別地圖滋潤。考慮到這一點,無論您的主鍵是自動增量ID還是唯一字段,都無關緊要。如果您在父類中定義了ssn,則可以在所有子類中進行搜索。

所以這裏有一些技巧。如果你願意,你可以刪除自動編號並使用ssn作爲你的主鍵,然後教條期望你的所有子表中都有相同的字段。對於性能來說,讓一個整數而不是255個字符串來完成連接可能是明智的。

如果你想十個分量的自動ID,您可能需要一個唯一索引添加到父類,這樣,如果你通過實地訪問類,你不會得到性能下降。

如果你想擁有類名是什麼,是別的表名,使用此

/** @Id @Column(name="p_id") */ 
public $id; 

但後來記住,所有那些繼承應使用該名稱的一部分的表。此外,我通常使用原則來映射現有數據庫並對其進行擴展(遷移到原則),如果我添加了新功能並且模型需要這樣做,我會自己創建映射表和表格學說繼承的作品。但是,如果您有現有的表格認爲可以使用繼承進行建模,則可能會遇到一些問題,並且可能需要修改現有的表格。

希望這會有所幫助。