web-dev-qa-db-ja.com

Symfony2 Doctrineでカスケードオプションを使用するにはどうすればよいですか?

Doctrinecascade オプションを理解しようとしていますSymfony2

子エンティティを削除できるようにしたい(そして外部キー制約エラーをトリガーしない)。

私には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親行を削除または更新できません:
外部キー制約が失敗しました(mybundle.sms、CONSTRAINT FK_B0A93A77BB333E0D外部キー(reportId)リファレンスreportid))

cascadeオプションはどこで使用し、どのオプションを使用すればよいですか(detachまたはremove)?

私はこれを理解するために多くの試行錯誤を行うことができますが、私は専門家の説明を望んでいたので、私は何かを見落とさないでください。

15
user1383418

使ってみてください

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

そして、スキーマを更新します。データベースレベルのカスケードを追加します

27
Ziumin

Ziuminの答え

onDeleteオプションを使用してORM JoinColumn

子アイテムを削除する場合に機能するメソッド( Owning Side )。

しかし、親アイテムであるResponseを削除したい場合( Inverse Side )、これはcascadeが便利になるときです。 Reportエンティティーに、そのコレクション(OneToMany関係)ごとに以下を追加しました。

レポート

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

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

ここで、Reportを削除すると、ResponseおよびSMSテーブル内の関連するエントリがすべて削除されます。

11
user1383418

すべてのアクションを更新するためにcascade=allを使用することもできます。

レポート

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

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