我试图理解Symfony2cascade中Doctrine中的选项.
我希望能够删除子实体(而不是触发外键约束错误.)
我有3个实体:
报告
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report")
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report")
*/
protected $sms;
Run Code Online (Sandbox Code Playgroud)
响应
/**
* @ORM\ManyToOne(targetEntity="Report", inversedBy="responses")
*/
protected $report;
Run Code Online (Sandbox Code Playgroud)
短信
/**
* @ORM\ManyToOne(targetEntity="Report")
*/
protected $report;
Run Code Online (Sandbox Code Playgroud)
现在我想删除一个Response实体,但我得到了
SQLSTATE [23000]:完整性约束违规:1451无法删除或更新父行:
外键约束失败(mybundle.sms,CONSTRAINTFK_B0A93A77BB333E0DFOREIGN KEY(reportId)REFERENCESreport(id))
我在哪里使用该cascade选项以及我应该使用哪个选项(detach或remove)?
我可以做很多试验和错误来解决这个问题,但我希望得到专家的解释,所以我不会忽视某些事情.
Ziu*_*min 27
尝试使用
/**
* @ORM\ManyToOne(targetEntity="Report", inversedBy="responses")
* @ORM\JoinColumn(name="reportId", referencedColumnName="id", onDelete="CASCADE")
*/
protected $report;
Run Code Online (Sandbox Code Playgroud)
然后更新yor架构.它将添加数据库级别级联
use*_*418 11
Ziumin的回答
使用
onDelete选项ORM JoinColumn
当您要删除子项(Owning 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;
Run Code Online (Sandbox Code Playgroud)
现在,当我删除a时Report,它会删除Response和SMS表中的所有相关条目.
| 归档时间: |
|
| 查看次数: |
27788 次 |
| 最近记录: |