如何使用Symfony2的学说级联选项?(How do I use the cascade opti

2019-08-02 17:05发布

我想了解cascadeSymfony2的 教义选项。

我希望能够删除子实体(而不是触发外键约束的错误。)

我有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无法删除或更新父行:
一个外键约束失败( mybundlesms ,约束FK_B0A93A77BB333E0D外键( reportId )参考reportid ))

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

我可以做很多试验和错误的摸不着头脑,但我希望对专家的解释,所以我不忽视的东西。

Answer 1:

尝试使用

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

然后更新侑架构。 这会增加数据库级级联



Answer 2:

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



Answer 3:

您也可以使用cascade=all FOR UPDATE的所有操作。

报告

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

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


文章来源: How do I use the cascade option in Symfony2 Doctrine?