Page tree

destroy 메소드 구현

마지막으로 프로젝트 삭제 기능을 구현해 보겠습니다. 삭제는 위험한 기능이므로 별도의 추가 확인 절차를 거쳐야 하지만 본 예제에서는 생략하도록 하겠습니다. 실제 데이타를 삭제하는 메소드는 destroy() 이므로 다음 코드를 추가합니다.

public function destroy($id)
{
    $proj = Project::findOrFail($id);

    foreach($proj->tasks()->get() as $task) {	//1
        $task->delete();
    }

    $proj->delete();	// 2

    return redirect('/project')
        ->with('message', '프로젝트 ' . $proj->name  . ' 이 삭제되었습니다.');
}
  • 1: 파라미터로 넘어온 id 로 프로젝트를 검색한 후에 REF: 연관 모델 삭제 에서 설명한대로 task 모델이 있을 경우 project 모델을 삭제할 수 없으므로 먼저 모든 자식 task를 삭제합니다. 모든 자식 모델을 가져오는 코드는 $proj->task 처럼 dynamic property를 사용해도 되지만 개인적으로는 () 를 사용하는 실수를 하는 경우가 많아서 $proj->tasks()->get() 방식으로 사용하는 것을 선호합니다.
  • 2:  모델의 delete() 메소드를 호출하여 데이타를 삭제합니다. 
  • 3: 처리한 결과를 message 를 키로 하여 세션에 넣은 후에 인덱스 페이지에 전달합니다. 

 

뷰 구현

삭제는 별도의 뷰를 만들지 않고 project.index 에 삭제 버튼을 만들어 두었으므로 이를 수정해서 사용하겠습니다. 

<a class="btn btn-danger" href="{{ route('project.destroy', $proj->id) }}">삭제</a>

위 코드를 다음과 같이 수정합니다.

<form method="POST" action="{{ route('project.destroy', $proj->id) }}">	// 1
    {{ csrf_field() }}
    {{ method_field('DELETE') }}	//2
    <button type="submit" class="btn btn-danger">
        삭제
    </button>
</form>
  • 1 : 삭제를 수행하는 project.destroy 라우팅에 연결합니다.
  • 2:  HTTP 의 DELETE 메소드를 사용해야 하므로 method_field() 의 파라미터로 DELETE 를 사용합니다.

이제 기능 구현이 끝났습니다. 브라우저에서 "삭제" 버튼을 클릭하여 정상적으로 동작하는 지 확인해 봅시다.