Backport(バックポート) #1475
error at the application cascading of doctrine.(Doctrineのカスケーディングデリート 時にエラーになる)
100%
説明
Overview (現象)¶
Doctrine側でカスケーディングデリートを有効にした場合、日記を削除しようとするとエラーになります。
Causes (原因)¶
lib/behavior/opApplicationLevelCascadingListener.class.php の 32行目でエラーになっており、
$record が空の配列であるにも関わらずdelete()を呼んでいてメソッドが解決できずエラーとなっています。
Way to fix (修正内容)¶
$relations が Doctrine_Collection でない場合に array($relations) としているのが原因で、
この場合、$relationsが空の配列であった場合に要素数が1となってしまい、foreach で空の $record を処理してしまいます。
22 if (!($relations instanceof Doctrine_Collection)) 23 { 24 $relations = array($relations); 25 }
以下のようにして配列の要素数が0であった場合、continue するように対処するのが良いのではと思います。
22 if (!($relations instanceof Doctrine_Collection)) 23 { if (!count($relations)) { continue; } 24 $relations = array($relations); 25 }
関連するチケット
関係しているリビジョン
fixed cascading delete in the application level cascading.(fixes #1475)
fixed check instance of class. (fixes #1475)
fixed instance name (fixes #1475)
履歴
#1 Masato Nagasawa が13年以上前に更新
- 対象バージョン を OpenPNE 3.7.0 から OpenPNE 3.6beta4 に変更
#2 Masato Nagasawa が13年以上前に更新
- 題名 を Doctrineのカスケーディングデリート 時にエラーになる から error at the application cascading of doctrine.(Doctrineのカスケーディングデリート 時にエラーになる) に変更
- 担当者 を Masato Nagasawa にセット
#3 Masato Nagasawa が13年以上前に更新
- ステータス を New(新規) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 d043ed7c6fe4bbca28332114478e622cf2815bfd で適用されました。
#4 Masato Nagasawa が13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Accepted(着手) に変更
この対応では不十分でした。
delete()が定義されていないものが来るケースがあるようです。(画像添付された日記を削除するときにエラーになる)
以下のようにしてインスタンスが Doctrine_Record かどうか判定する処理を追加します。
case 'cascade': if($record instanceof Doctrine_Record) { $record->delete(); } break;
#5 Masato Nagasawa が13年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
更新履歴 424840da85156873e46a627ed4cb2279a52f54d0 で適用されました。
#6 Rimpei Ogawa が13年以上前に更新
- 3.6 で発生するか を Yes にセット
#7 Masato Nagasawa が13年以上前に更新
更新履歴 a739822932dbe2eec35a73c2bb0751ad6cc345a1 で適用されました。
#8 Hiroki Mogi が13年以上前に更新
テストを行ないました。正常に動作していました。
#9 Kousuke Ebihara が13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
#10 Kousuke Ebihara が13年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更