我有一个实体,它有这样的关系:
/**
* @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 contract
(id
))
如果我检查这个表的约束,用这个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 |
个
这不是级联删除?我真的不知道,我不知道为什么它试图删除子合同。
它没有检测到我删除了“级联”限制吗?这是另一个问题吗?
1条答案
按热度按时间uurity8g1#
当删除对象/条目时,需要指定关系级别的行为。这里,您希望在删除子对象时
parentContract
为null。在Doctrine中,你可以通过
onDelete
属性来实现这一点。字符串