我想了解cascade
在Symfony2的 教义选项。
我希望能够删除子实体(而不是触发外键约束的错误。)
我有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;
短信
/**
* @ORM\ManyToOne(targetEntity="Report")
*/
protected $report;
现在我想删除Response
实体,但我得到
SQLSTATE [23000]:完整性约束违规:1451无法删除或更新父行:
一个外键约束失败( mybundle
。 sms
,约束FK_B0A93A77BB333E0D
外键( reportId
)参考report
( id
))
我在哪里使用cascade
选项,我应该使用(哪个选项detach
或remove
)?
我可以做很多试验和错误的摸不着头脑,但我希望对专家的解释,所以我不忽视的东西。
尝试使用
/**
* @ORM\ManyToOne(targetEntity="Report", inversedBy="responses")
* @ORM\JoinColumn(name="reportId", referencedColumnName="id", onDelete="CASCADE")
*/
protected $report;
然后更新侑架构。 这会增加数据库级级联
Ziumin的答案
使用onDelete
的选项ORM JoinColumn
方法工作时,要删除一个子项( 拥有方 )。
但是,如果你想删除一个Response
这是一个父项( 反方 ),这是当cascade
就派上用场了。 在Report
实体加我为它的每个集合(一对多关系)的以下内容:
报告
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"remove"})
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"remove"})
*/
protected $sms;
现在,当我删除一个Report
,它会删除其所有的相关条目中的Response
和SMS
表。
您也可以使用cascade=all
FOR UPDATE的所有操作。
报告
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"all"})
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"all"})
*/
protected $sms;