Doctrineの cascade
オプションを理解しようとしています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
、CONSTRAINTFK_B0A93A77BB333E0D
外部キー(reportId
)リファレンスreport
(id
))
cascade
オプションはどこで使用し、どのオプションを使用すればよいですか(detach
またはremove
)?
私はこれを理解するために多くの試行錯誤を行うことができますが、私は専門家の説明を望んでいたので、私は何かを見落とさないでください。
使ってみてください
/**
* @ORM\ManyToOne(targetEntity="Report", inversedBy="responses")
* @ORM\JoinColumn(name="reportId", referencedColumnName="id", onDelete="CASCADE")
*/
protected $report;
そして、スキーマを更新します。データベースレベルのカスケードを追加します
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
テーブル内の関連するエントリがすべて削除されます。
すべてのアクションを更新するためにcascade=all
を使用することもできます。
レポート
/**
* @ORM\OneToMany(targetEntity="Response", mappedBy="report", cascade={"all"})
*/
protected $responses;
/**
* @ORM\OneToMany(targetEntity="SMS", mappedBy="report", cascade={"all"})
*/
protected $sms;