2011-07-21 49 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; 

但后来记住,所有那些继承应使用该名称的一部分的表。此外,我通常使用原则来映射现有数据库并对其进行扩展(迁移到原则),如果我添加了新功能并且模型需要这样做,我会自己创建映射表和表格学说继承的作品。但是,如果您有现有的表格认为可以使用继承进行建模,则可能会遇到一些问题,并且可能需要修改现有的表格。

希望这会有所帮助。