我正在尝试了解 Symfony2 中 Doctrine 中的cascade
选项。
我希望能够删除子实体(而不是触发外键约束错误。)
我有3个实体:
报告
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report")
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report")
*/
protected $sms;
响应
/**
* @ORM\ManyToOne(targetEntity="Report", inversedBy="responses")
*/
protected $report;
SMS
/**
* @ORM\ManyToOne(targetEntity="Report")
*/
protected $report;
现在我想删除一个Response
实体,但我得
SQLSTATE [23000]:完整性约束违规:1451无法删除或更新父行:
外键约束失败(mybundle
。sms
,CONSTRAINTFK_B0A93A77BB333E0D
FOREIGN KEY(reportId
)参考report
(id
))
我在哪里使用cascade
选项以及我应该使用哪个选项(detach
或remove
)?
我可以做很多试验和错误来解决这个问题,但我希望有专家解释,所以我不会忽视某些事情。
答案 0 :(得分:27)
尝试使用
/**
* @ORM\ManyToOne(targetEntity="Report", inversedBy="responses")
* @ORM\JoinColumn(name="reportId", referencedColumnName="id", onDelete="CASCADE")
*/
protected $report;
然后更新您的架构。它将添加数据库级别级联
答案 1 :(得分:11)
Ziumin的回答
使用
的onDelete
ORM JoinColumn
选项
方法在您要删除子项目(Owning Side)时有效。
但是如果你想删除一个父项(Inverse Side)的Response
,这就是cascade
派上用场的时候。在Report
实体中,我为其每个集合添加了以下内容(OneToMany关系):
报告强>
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"remove"})
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"remove"})
*/
protected $sms;
现在,当我删除Report
时,会删除Response
和SMS
表中的所有相关条目。
答案 2 :(得分:1)
您也可以使用cascade=all
更新所有操作。
报告强>
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"all"})
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"all"})
*/
protected $sms;