2017-10-17 7 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을 선호하는 코드에서 찾고 그런데