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

use*_*418 15 doctrine cascade

我试图理解Symfony2cascadeDoctrine中的选项.

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

我有3个实体:

报告

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

/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report")
*/
protected $sms;
Run Code Online (Sandbox Code Playgroud)

响应

/**
 * @ORM\ManyToOne(targetEntity="Report", inversedBy="responses")
 */
protected $report;
Run Code Online (Sandbox Code Playgroud)

短信

/**
 * @ORM\ManyToOne(targetEntity="Report")
 */
protected $report;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Ziu*_*min 27

尝试使用

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

然后更新yor架构.它将添加数据库级别级联

  • 尝试`onDelete ="SET NULL"`. (3认同)

use*_*418 11

Ziumin的回答

使用onDelete选项ORM JoinColumn

当您要删除子项(Owning 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;
Run Code Online (Sandbox Code Playgroud)

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