Doctrine 如何在Symfony2原则中使用级联选项?
我试图理解Symfony2中的原则中的选项 我希望能够删除子实体(并且不会触发外键约束错误) 我有3个实体: 报告Doctrine 如何在Symfony2原则中使用级联选项?,doctrine,cascade,Doctrine,Cascade,我试图理解Symfony2中的原则中的选项 我希望能够删除子实体(并且不会触发外键约束错误) 我有3个实体: 报告 /** * @ORM\OneToMany(targetEntity="Response", mappedBy="report") */ protected $responses; /** * @ORM\OneToMany(targetEntity="Response", mappedBy="report") */ protected $sms; /** * @ORM\OneTo
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report")
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report")
*/
protected $sms;
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"remove"})
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"remove"})
*/
protected $sms;
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"all"})
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"all"})
*/
protected $sms;
响应
/**
* @ORM\ManyToOne(targetEntity="Report", inversedBy="responses")
*/
protected $report;
短信
/**
* @ORM\ManyToOne(targetEntity="Report")
*/
protected $report;
现在我想删除响应
实体,但我得到
SQLSTATE[23000]:完整性约束冲突:1451无法删除或更新父行:外键约束失败(
mybundle
FK_B0A93A77BB33E0D
外键(reportId
)引用report
(id
)
我应该在哪里使用级联
选项?我应该使用哪个选项(分离
或删除
)
我可以做很多尝试和错误来解决这个问题,但我希望得到专家的解释,所以我不会忽视一些东西。尝试使用
/**
* @ORM\ManyToOne(targetEntity="Report", inversedBy="responses")
* @ORM\JoinColumn(name="reportId", referencedColumnName="id", onDelete="CASCADE")
*/
protected $report;
然后更新yor模式。它将添加数据库级级联Ziumin的答案
对列使用onDelete
选项
方法在要删除子项()时起作用
但是,如果您想删除父项()的响应
,这时级联
就派上了用场。在报告中
实体I为其每个集合(OneToMany关系)添加了以下内容:
报告
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report")
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report")
*/
protected $sms;
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"remove"})
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"remove"})
*/
protected $sms;
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"all"})
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"all"})
*/
protected $sms;
现在,当我删除报告时,它会删除响应
和SMS
表中的所有相关条目。您也可以使用cascade=all
更新所有操作
报告
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report")
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report")
*/
protected $sms;
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"remove"})
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"remove"})
*/
protected $sms;
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"all"})
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"all"})
*/
protected $sms;
哟。。成功了!谢谢不过,我想我需要很快重新审视这个问题。我还想删除报告。。我马上就要说了。简单的回答Ziumin,竖起大拇指,但我想这会从父母那里删除所有的孩子吗?有没有办法留住这些孩子?例如:我想删除一个用户(家长),但保留他的博客帖子(孩子)。然后将博客帖子的作者设置为空或未知或其他……尝试onDelete=“SET null”
。“不要盲目地将cascade=all应用于所有关联,因为这将不必要地降低应用程序的性能。对于激活的每个级联操作,原则也将该操作应用于关联,无论是单值还是集合值。“->