15

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

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

私は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_B0A93A77BB333E0DFOREIGN KEY ( reportId) REFERENCES report( id))

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

これを理解するために多くの試行錯誤を行うことができますが、専門家の説明を望んでいたので、見落としはありません。

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

ジウミンの答え

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

メソッドは、子アイテム (所有側)を削除するときに機能しました。

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内の関連するすべてのエントリが削除されます。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 に答える