2017-10-17 79 views
0

我有一个实体学生,其中有分配的主题。不幸的是,这些映射是奇怪的,我现在不允许改变它,但是作业知道它们属于哪个主题,主题知道它们属于哪个学生,而不是相反。学生不知道它的主题,它的主题不知道它的任务。更多我有onDelete = CASCADE“,所以默认情况下,学生将被删除与他的科目与他的任务。这工作正常。使用preRemove删除entiry之前执行检查

我想创建一个检查,如果学生有一个主题,学生不能删除,也没有问题。

如果没有开放的问题,我想删除的学生,主题和任务。

我如何执行呢?我想,我已经有一个这样的骨干;

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来停止或继续操作?或者我需要再次执行特定的学说,比如删除等。我不是100%确定下一步该做什么。

如果分配不能被删除,我还需要创建自定义异常。

任何人都可以请帮忙吗?我会很感激。

回答

0

我更喜欢创建一个服务,并在每次需要检查这种操作时使用它。可悲的教义事件和听众太复杂,并且在很长一段时间内会带来更多有益的问题。当然,如果你是“手动”的,你必须确保每次都将这个控制委托给该服务,并且不要手动删除这些对象。此外,使用服务可以使您的代码更少地耦合到ORM本身。

通过看你的代码有没有“银弹回答”这个,但我宁愿一个Exception(自定义类型),可逮住你需要知道,一些错误已经发生的方式

相关问题