2011-10-14 8 views
10

こんにちは私はカスケードするときOneToMany関係でエンティティを削除しようとしています。 数時間のデバッグの後、最新の2.1.2から2.0.2にドクトリンをダウングレードしようとしたところ、突然動作を開始しました。Doctrine 2.0対2.1カスケード削除OneToMany

2つのエンティティ会社と住所1:Nの関係を想像してください。

エンティティ会社を削除しようとすると、割り当てられたアドレスも削除されます。

$em->remove($company); 
$em->flush(); 

doctrine 2.1.2では、アドレスの削除は実行されないため、整合性制約は失敗します。バージョン2.0.2では完全に動作します。私がEntityAuditの拡張子https://github.com/simplethings/EntityAuditを使用している場合、LogRevisionListenerはdoctrine 2.1.2(もちろん2.0.2でも)のアドレスエンティティ(それらをrevtype = DELに設定)をバージョン管理していますが、UnitOfWorkはそれを削除していません。

2.0.2と2.1.2でカスケード削除を処理する方法に違いはありますか?

$em->remove($object); 
$em->flush(); 
$em->remove($user); 
$em->flush(); 

たぶん、あなたはアドレスのためにあなたのcompanyfindAllを使用して、これを削除することができます

は、私は同じ問題を満たしていると私はそのコードで彼を解決した非常に

+0

今日私もこの問題に遭遇しました。私は2.1.6を使用しています。 :/ – mokagio

+0

私は自分自身を修正する必要があります、それは今私のために働く!私は 'cascade = {" all "}"を使用していましたが、 '' cascade = {"remove"} 'で変更したところ、すべてうまく動作し始めました。 – mokagio

+0

カスケードオプションの組み合わせについていくつかのテストをした結果、エンティティに対して集中的な操作を行っているため、おそらく私の問題はアノテーションセットまたはDoctrine自体に起因するとは限りません。 '' merge ''オプションは問題を与えるオプションでした。 とにかく助けて欲しいと思っています。 – mokagio

答えて

1

をありがとうそのようなforeach

// Return all the addresses of the company 
$addresses = $em->getRepository(...)->findAllAddressesByCompany($company); 
$em->remove($company); 
foreach ($address in $addresses) 
{ 
    $em->remove($address); 
} 

非常に良い方法ではないのですが、今のところ、それは私がしたすべてです見つかりました。

+1

私は教義を格下げして解決しました:)ありがとうございます。しかし、それは私が探している方法ではありません:(おそらくバグかもしれませんか?) – stefi

10

@OneToMany(targetEntity="Address",mappedBy="company", 
cascade={"persist"}, orphanRemoval=true) 
+1

私はdoctrine 2.2.3を使っていても同じですが、orphanRemoval = trueを追加しなければいけません。片側を削除して孤児を作成していないので、奇妙な種類です。 。更新は、多くの側が所有側であり、 '$ this-> addSomething(theThing)'と 'theThing-> setSomething($ this)'の両方を使用しているので、アップデートが機能します。 、 '$ this-> removeSomething(theThing)'のみです。 – HMR

3

あなたCompanyクラスのaddresses属性でこれを使用してみてください、私は同じ問題を抱えていた...関係は、私は、カスケードを持っていた場合でも、追加または更新されますが、削除されませんでした:[持続、除去する]。

「カスケード」で「削除」属性が必要ないことがわかりましたが、orphanRemoval:trueを追加する必要がありました。

私は狂っていた、あなたは私の一日を作った!

関連する問題