gpt4 book ai didi

php - 如何在 Doctrine2 中为类表继承指定外键列?

转载 作者:搜寻专家 更新时间:2023-10-31 20:51:43 24 4
gpt4 key购买 nike

如何在 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

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

如果我有一个遗留数据库,其中 employee.person_id 被称为 employee.p_id 呢?

最佳答案

首先,您在 Employee 类定义中缺少“extends Person”。

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

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

这里有一些提示。如果你愿意,你可以删除自动 id 并使用 ssn 作为你的主键,然后 doctrine 期望你的所有子表都在其中定义了相同的字段。为了性能,无论如何使用整数而不是 255 字符串来进行连接可能是明智的。

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

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

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

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

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

希望这对您有所帮助。

关于php - 如何在 Doctrine2 中为类表继承指定外键列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6776916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com