Doctrine 如何在Symfony2原则中使用级联选项?

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

我试图理解Symfony2中的原则中的选项

我希望能够删除子实体(并且不会触发外键约束错误)

我有3个实体:

报告

/**
* @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应用于所有关联,因为这将不必要地降低应用程序的性能。对于激活的每个级联操作,原则也将该操作应用于关联,无论是单值还是集合值。“->