【问题标题】:How to specify foreign key column for Class Table Inheritance in Doctrine2?如何在 Doctrine2 中为类表继承指定外键列?
【发布时间】:2011-07-21 13:35:46
【问题描述】:

如何使用 Doctrine 2 中的类表继承指定用于外键关系的列?比如下面两个类:

/**
 * @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;
}

有了这个,Doctrine 期望一个表结构有点像这样:

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

有一个外键employee.person_id 指向person.id。但是我怎样才能告诉 Doctrine 使用哪些列呢?我假设person.id 引用来自Person 类上的@Id 注释,但如果我想改为创建person.ssn 的FK 怎么办(这是可以想象的,因为SSN 天生是唯一的)。

如果我有一个旧数据库,其中 employee.person_id 被称为 employee.p_id 怎么办?

【问题讨论】:

  • 我认为它们必须是相同的(具有与父级相同的主键的子类),我记得目前有人谈论这是一个限制。希望稍后会尝试找到对此的参考。
  • 谢谢。不过听起来很奇怪。我相信doctrine orm:schema-tool:create 想创建一个以employee.person_id 作为外键的表,而不是employee.id。明天我回来工作时会检查。

标签: php sql inheritance doctrine-orm class-table-inheritance


【解决方案1】:

首先,您缺少 Employee 类定义中的“扩展人”。

据我所知,当您进行这种类型的继承时,学说使用主类中的主键来连接所有其他表,这是预期的行为。

当你进行查询时,学说会将所有子表连接到父表,然后根据鉴别器映射进行水合。考虑到这一点,您的主键是自动递增的 id 还是唯一字段都没有关系。如果您在父类中定义了 ssn,它将可用于在您的所有子类中进行搜索。

这里有几个提示。如果需要,您可以删除自动 id 并使用 ssn 作为主键,然后教义期望您的所有子表都在其中定义相同的字段。出于性能考虑,最好使用整数而不是 255 字符串来进行连接。

如果您想保持自动 id,您可能需要为父类添加一个唯一索引,这样如果您通过该字段访问类,就不会降低性能。

如果你想让类名是什么而表名是别的,使用这个

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

但请记住,作为继承一部分的所有表都应使用该名称。

此外,我通常使用学说来映射现有数据库并对其进行扩展(迁移到学说),如果我要添加新功能并且模型需要这样做,我会自己创建映射和表,同时牢记学说如何继承作品。但是,如果您有认为可以使用继承建模的现有表,则可能会遇到一些麻烦,并且可能需要修改现有表。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 2022-01-17
    • 2014-08-13
    • 2013-11-08
    相关资源
    最近更新 更多