Php 条令一对一双向关系级联方向

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

我有两个用yaml注释定义的条令实体(User和DatiFiscali),如下所示

我试图实现的是,当删除用户时,也会在级联上删除DatiFiscali

然而,通过下面的配置,我只能获得相反的行为:当删除DatiFiscali时,用户也将在级联上被删除

我可以通过手动添加以下外键轻松获得所需结果:

CONSTRAINT `datifiscali_ibfk_1` FOREIGN KEY (`id`) REFERENCES `User` (`datifiscali_id`) ON DELETE CASCADE
但是,当使用“docrine orm:schema tool:update”更新模式时,将尝试删除上面的外键

以任何方式实现上述目标,而无需:

  • 改变关系的方向
  • 必须使用自定义sql,而不是依赖orm:schema工具:create
实体A:

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您需要在类的属性user
DatiFiscali
上指定
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您需要在类的属性user
DatiFiscali
上指定
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”列(相同关系的双索引)。