15

我试图了解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;

短信

/**
 * @ORM\ManyToOne(targetEntity="Report")
 */
protected $report;

现在我想删除一个Response实体,但我得到了

SQLSTATE [23000]:完整性约束违规:1451 无法删除或更新父行:
外键约束失败(mybundle. sms, CONSTRAINT FK_B0A93A77BB333E0DFOREIGN KEY ( reportId) REFERENCES report( id))

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

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

4

3 回答 3

27

尝试使用

/**
 * @ORM\ManyToOne(targetEntity="Report", inversedBy="responses")
 * @ORM\JoinColumn(name="reportId", referencedColumnName="id", onDelete="CASCADE")
 */
protected $report;

然后更新你的架构。它将添加数据库级级联

于 2012-11-14T06:51:38.117 回答
12

Ziumin的回答

使用onDelete选项ORM JoinColumn

当您要删除子项(拥有方)时,该方法有效。

但是,如果您想删除作为Response父项 ( Inverse Side ) 的 a ,这cascade将派上用场。在Report实体中,我为其每个集合(OneToMany 关系)添加了以下内容:

报告

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

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

现在,当我删除 a 时,它会删除和表Report中的所有关联条目。ResponseSMS

于 2012-11-15T05:11:13.367 回答
1

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

报告

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

 /**
 * @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"all"})
 */
protected $sms;
于 2013-06-11T16:58:13.913 回答