2017-10-17 8 views
0

私は課題を持つ科目を持っているエンティティスチューデントを持っています。残念なことにマッピングは奇妙で、私は今それを変更することは許されませんが、割り当ては彼らがどの科目に属しているかを知っており、科目は彼らが所属する学生を知っています。学生はその科目を知らず、その科目はその課題を知らない。さらに、私はonDelete = CASCADEを持っているので、デフォルトでは学生は割り当てられた科目で削除されてしまいます。学生は削除、また対象とすることはできません。preRemoveでエントリーを削除する前に確認してください

私は学生、件名、および割り当てを削除したい何のオープン対象が存在しない場合。

どのように私は私は私が既に持っていると思いますか?これを実行することができますこのようなバックボーン;

public function preRemove(LifecycleEventArgs $args) 
    { 
     $em = $args->getEntityManager(); 
     $student = $args->getEntity(); 

     if ($student instanceof Student) { 
      $subjects = $em->getRepository(Subject::class)->findBy(['student' => $student]); 

      foreach ($subjects as $subject) { 
       if ($subject instanceof Subject) { 
        $assignments = $em->getRepository(Assignment::class)->findBy(['subject' => $subjects]); 

        foreach ($assignments as $assignment) { 
         if ($assignment->isCompleted()) { 
          echo $assignment." - CAN DELETE<br>"; 
         } else { 
          echo $assignment." - CAN'T DELETE, THERE ARE OPEN ASSIGNMENTS!<br>"; 
         } 
        } 
       } 
      } 
     } 
    } 

今何が正しい方法になるのでしょうか? trueまたはfalseを返すだけで、操作を停止または続行できますか?あるいは、私は特定のDoctrineを再び削除する必要がありますか?私は100%次のことを確実にしていません。

割り当てを削除できない場合は、カスタム例外を作成する必要があります。

誰でもお手伝いできますか?私はそれを多く感謝します。

答えて

0

この種の操作を確認する必要があるたびに、サービスを作成して使用することをお勧めします。悲しいことに、教義のイベントやリスナーは複雑すぎて、長い間、より多くの問題をもたらします。もちろん、手動で行う場合は、毎回そのコントロールをそのサービスに委任し、これらのオブジェクトを手動で削除しないようにする必要があります。さらに、サービスを持つことで、ORM自体にコードが結合されにくくなります。ところで

あり、このための「銀の弾丸の答えは」ませんが、私はあなたが間違って何かが

に起こったことを知っておく必要がある場所catchedすることができます(カスタムタイプの) Exceptionを好むだろうあなたのコードを見て
関連する問題