Php 条令一对一双向关系级联方向
我有两个用yaml注释定义的条令实体(User和DatiFiscali),如下所示 我试图实现的是,当删除用户时,也会在级联上删除DatiFiscali 然而,通过下面的配置,我只能获得相反的行为:当删除DatiFiscali时,用户也将在级联上被删除 我可以通过手动添加以下外键轻松获得所需结果:Php 条令一对一双向关系级联方向,php,symfony,doctrine-orm,annotations,doctrine,Php,Symfony,Doctrine Orm,Annotations,Doctrine,我有两个用yaml注释定义的条令实体(User和DatiFiscali),如下所示 我试图实现的是,当删除用户时,也会在级联上删除DatiFiscali 然而,通过下面的配置,我只能获得相反的行为:当删除DatiFiscali时,用户也将在级联上被删除 我可以通过手动添加以下外键轻松获得所需结果: CONSTRAINT `datifiscali_ibfk_1` FOREIGN KEY (`id`) REFERENCES `User` (`datifiscali_id`) ON DELETE CA
CONSTRAINT `datifiscali_ibfk_1` FOREIGN KEY (`id`) REFERENCES `User` (`datifiscali_id`) ON DELETE CASCADE
但是,当使用“docrine orm:schema tool:update”更新模式时,将尝试删除上面的外键
以任何方式实现上述目标,而无需:
- 改变关系的方向
- 必须使用自定义sql,而不是依赖orm:schema工具:create
Test\User:
type: entity
table: User
id:
id:
type: integer
generator:
strategy: AUTO
fields:
username:
type: text
nullable: true
email:
type: text
nullable: true
oneToOne:
datiFiscali:
targetEntity: DatiFiscali
inversedBy: user
joinColumns:
datifiscali_id:
referencedColumnName: id
onDelete: CASCADE
Test\DatiFiscali:
type: entity
table: DatiFiscali
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
type: text
nullable: true
surname:
type: text
nullable: true
business_name:
type: text
nullable: true
oneToOne:
user:
targetEntity: User
mappedBy: datiFiscali
实体B:
Test\User:
type: entity
table: User
id:
id:
type: integer
generator:
strategy: AUTO
fields:
username:
type: text
nullable: true
email:
type: text
nullable: true
oneToOne:
datiFiscali:
targetEntity: DatiFiscali
inversedBy: user
joinColumns:
datifiscali_id:
referencedColumnName: id
onDelete: CASCADE
Test\DatiFiscali:
type: entity
table: DatiFiscali
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
type: text
nullable: true
surname:
type: text
nullable: true
business_name:
type: text
nullable: true
oneToOne:
user:
targetEntity: User
mappedBy: datiFiscali
谢谢你的帮助 尝试将级联选项放在正确的位置:
oneToOne:
datiFiscali:
targetEntity: DatiFiscali
inversedBy: user
joinColumns:
datifiscali_id:
referencedColumnName: id
cascade: ["remove"]
尝试将级联选项放在正确的位置:
oneToOne:
datiFiscali:
targetEntity: DatiFiscali
inversedBy: user
joinColumns:
datifiscali_id:
referencedColumnName: id
cascade: ["remove"]
尝试使用级联:[remove]。但我不确定在这种情况下它应该定义在哪一边。可能在
DatiFiscali
中。更多信息:感谢@dragoste的建议,令人惊讶的是,我在两个文件中都尝试了cascade:[remove],但没有任何结果:orm级别上没有发生cascade delete。@Davide您需要在类的属性userDatiFiscali
上指定onDelete:cascade
。就目前而言,您说的是“在删除DatiFiscali时删除用户pls”,但您想说的是“在删除用户时,删除DatiFiscali pls”。好的,我显然也在oneToOne关系中尝试过这一点,当定义了“mappedBy”属性时,忽略任何“joinColumn”属性。通过注释mappedBy,我们提出了以下更改:altertable DatiFiscali ADD user_id INT DEFAULT NULL;ALTER TABLE DatiFiscali ADD CONSTRAINT FK_7A2A1DE5A76ED395外键(用户id)引用删除级联上的用户(id);在DatiFiscali(用户id)上创建唯一索引UNIQ_7A2A1DE5A76ED395
这意味着架构现在将有一个额外的“user\u id”列(相同关系的两个索引)。请尝试使用cascade:[remove]
。但我不确定在这种情况下它应该定义在哪一边。可能在DatiFiscali
中。更多信息:感谢@dragoste的建议,令人惊讶的是,我在两个文件中都尝试了cascade:[remove],但没有任何结果:orm级别上没有发生cascade delete。@Davide您需要在类的属性userDatiFiscali
上指定onDelete:cascade
。就目前而言,您说的是“在删除DatiFiscali时删除用户pls”,但您想说的是“在删除用户时,删除DatiFiscali pls”。好的,我显然也在oneToOne关系中尝试过这一点,当定义了“mappedBy”属性时,忽略任何“joinColumn”属性。通过注释mappedBy,我们提出了以下更改:altertable DatiFiscali ADD user_id INT DEFAULT NULL;ALTER TABLE DatiFiscali ADD CONSTRAINT FK_7A2A1DE5A76ED395外键(用户id)引用删除级联上的用户(id);在DatiFiscali(用户id)上创建唯一索引UNIQ_7A2A1DE5A76ED395
这意味着模式现在将有一个额外的“user\u id”列(相同关系的双索引)。