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

时间:2012-11-14 05:48:35

标签: doctrine cascade

我正在尝试了解 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无法删除或更新父行:
  外键约束失败(mybundlesms,CONSTRAINT FK_B0A93A77BB333E0D FOREIGN KEY(reportId)参考reportid))

我在哪里使用cascade选项以及我应该使用哪个选项(detachremove)?

我可以做很多试验和错误来解决这个问题,但我希望有专家解释,所以我不会忽视某些事情。

3 个答案:

答案 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时,会删除ResponseSMS表中的所有相关条目。

答案 2 :(得分:1)

您也可以使用cascade=all更新所有操作。

报告

 /**
 * @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"all"})
 */
protected $responses;

 /**
 * @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"all"})
 */
protected $sms;