Symfony 4:实体关系级联“删除”原则无法检测更改

eeq64g8w  于 10个月前  发布在  其他
关注(0)|答案(1)|浏览(147)

我有一个实体,它有这样的关系:

/**
 * @ORM\OneToOne(targetEntity="App\Entity\Contract", inversedBy="childContract", cascade={"persist", "remove"})
 */
private $parentContract;

/**
 * @ORM\OneToOne(targetEntity="App\Entity\Contract", mappedBy="parentContract", cascade={"persist", "remove"})
 */
private $childContract;

字符串
我的schema已经生成,直到现在我都在使用它,我决定取出"remove"部分:

/**
 * @ORM\OneToOne(targetEntity="App\Entity\Contract", inversedBy="childContract", cascade={"persist"})
 */
private $parentContract;

/**
 * @ORM\OneToOne(targetEntity="App\Entity\Contract", mappedBy="parentContract", cascade={"persist"})
 */
private $childContract;


但如果我执行命令:

bin/console doctrine:schema:update --dump-sql


我得到输出:
[OK]无更新-您的数据库已与当前实体元数据同步。
事实上,当我试图删除一个合约时,Doctrine试图删除子合约,我得到了这个异常(这是,它试图删除子合约):
使用参数[2098]执行“CNOW FROM contract WHERE id =?”时发生异常:SQLSTATE[23000]:违反完整性约束:1451无法删除或更新父行:外键约束失败(prestazoom. contract,CONSTRAINT FK_E98F28594E5AF28D FOREIGN KEY(parent_contract_id)REFERENCES contractid))
如果我检查这个表的约束,用这个SQL命令:

SELECT 
  r.CONSTRAINT_NAME,
  r.DELETE_RULE, 
  r.TABLE_NAME,
  GROUP_CONCAT(k.COLUMN_NAME SEPARATOR ', ') AS `constraint columns`,
  r.REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS r
  JOIN information_schema.KEY_COLUMN_USAGE k
  USING (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME)
-- using MySQL's GROUP BY clause. In other DB's more columns would need to be
-- specified!
WHERE r.CONSTRAINT_SCHEMA = 'prestazoom' and r.TABLE_NAME = 'contract'
GROUP BY r.CONSTRAINT_CATALOG,
     r.CONSTRAINT_SCHEMA,
     r.CONSTRAINT_NAME;


我得到这个输出:
| FK_E98F28594E5AF28D | RESTRICT | contract | parent_contract_id | contract |
这不是级联删除?我真的不知道,我不知道为什么它试图删除子合同。
它没有检测到我删除了“级联”限制吗?这是另一个问题吗?

uurity8g

uurity8g1#

当删除对象/条目时,需要指定关系级别的行为。这里,您希望在删除子对象时parentContract为null。
在Doctrine中,你可以通过onDelete属性来实现这一点。

/**
 * @ORM\OneToOne(targetEntity="App\Entity\Contract", inversedBy="childContract", cascade={"persist"}, onDelete="SET NULL")
 */
private $parentContract;

/**
 * @ORM\OneToOne(targetEntity="App\Entity\Contract", mappedBy="parentContract", cascade={"persist"})
 */
private $childContract;

字符串

相关问题