모델 삭제(Delete)

모델을 데이타베이스의 레코드에서 삭제하려면 모델 인스턴스의 delete() 를 호출해 주면 됩니다.

public function getDelete($id)
{
    $task = Task::find($id);
    
    $ret = $task->delete();

    return response()->json(['ret' => $ret], 
         200, [], JSON_PRETTY_PRINT);
}
CODE

만약 모델을 찾지 못했을 경우 $task 객체가 null 이며 널 객체에서 delete() 를 호출하면 아래와 같이 FatalErrorException 이 발생하므로 실제 운영용 애플리케이션은 리턴 값에 대해 null 체크를 하거나 find 대신 findOrFail 메소드를 사용하는게 좋습니다.

존재하는 모델 삭제

모델의 delete() 메소드는 null 체크를 해야 하므로 기본 키를 안다면 destory() 정적 메소드로 바로 삭제할 수 있습니다. 

public function getDestroy($id)
{
    $ret = Task::destroy($id);
    
    return response()->json(['ret' => $ret], 
         200, [], JSON_PRETTY_PRINT);
}
CODE

 

리턴 값은 삭제된 모델의 갯수이므로 몇 건의 레코드가 삭제되었는지 알 수 있습니다. 여러 개의 모델을 한 번에 삭제할 경우 destory() 에 배열을 전달해 주면 됩니다.

public function getDestroyArray($id)
{	
	// 1,2,3 형식의 $id 를 배열로 변환
    $array = explode(',', $id);

    $ret = Task::destroy($array);
    
    return response()->json(['ret' => $ret], 
         200, [], JSON_PRETTY_PRINT);
}
CODE

위 예제는 브라우저로 http://homestead.app/orm/destroy-array/1,2,3 와 같이 삭제할 id 를 , 를 구분자로 넣어주면 [1,2,3] 이라는 배열로 변환하여 기본 키 값이 일치하는 레코드를 삭제합니다.

 

또는 where() 구문을 사용하여 삭제할 수도 있으며 여러 개의 조건이 있을 경우 메소드 체이닝으로 연결하면 됩니다.

public function getDeleteWhere($from, $to)
{	
    $ret = Task::where('id', '>', $from)
        ->where('id', '<', $to)->delete();
    
    return response()->json(['ret' => $ret], 
         200, [], JSON_PRETTY_PRINT);
}
CODE

이제 브라우저로 http://homestead.app/orm/delete-where/30/37 에 연결하면 id 가 30 보다 크고 37 보다 작은 모든 모델을 삭제할 수 있습니다.

소프트 삭제(Soft Delete)

소프트 삭제는 실제 데이타베이스에서 삭제되는 게 아니고 deleted_at 컬럼을 만들고 delete() 호출시 이 컬럼에 삭제 시간을 설정합니다. 이 컬럼에 값이 설정된 모델은 기본적인 쿼리의 결과에는 포함되지 않습니다.

테이블에 소프트 삭제 가능 여부는 다음 절차에 따라서 이루어 집니다.

  1. 테이블 스키마에 deleted_at 컬럼을 추가
  2. 모델 클래스에  Illuminate\Database\Eloquent\SoftDeletes 트레이트(trait) 사용
  3. 모델 클래스의 날짜 컬럼을 표시하는 변수인 $dates 에 deleted_at 컬럼 추가

 

이제 위 순서에 따라서 Task 모델 클래스를 소프트 삭제를 가능하게 만들어 보겠습니다.

 

  1. deleted_at 컬럼을 추가하기 위한 migration 을 만듭니다.

    $ php artisan make:migration soft_delete_task_table --table=tasks
    Created Migration: 2015_07_22_090525_soft_delete_task_table
    CODE
  2. 생성된 migration 파일(예: database/migrations/2015_07_22_090525_soft_delete_task_table.php)을 열어서 up() 메소드에서  테이블에 deleted_at 컬럼을 추가하기 위해 스키마 빌더 클래스의 up() 메소드에서 softDeletes() 메소드를 호출해 줍니다.

    public function up()
    {
        Schema::table('tasks', function (Blueprint $table) {
            $table->softDeletes();
        });
    }
    CODE
  3. db migration 을 적용합니다.

    $ php artisan migrate
    Migrated: 2015_07_22_090525_soft_delete_task_table
    CODE
  4. 모델 클래스에서 Illuminate\Database\Eloquent\SoftDeletes 트레이트를 사용하고 $dates 변수에 deleted_at 컬럼을 추가합니다.
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Task extends Model
{
    use SoftDeletes;

    protected $dates = ['deleted_at'];
}
CODE

이제 delete() 로 삭제한 모델들은 deleted_at 컬럼이 설정되어 기본 조회 조건에 포함되지 않습니다.

 

소프트 삭제 결과 포함

모델의 withTrashed() 메소드를 사용하면 소프트 삭제된 모델도 포함시킬 수 있으며 onlyTrashed() 을 사용하면 소프트 삭제된 모델만 대상으로 검색할 수 있습니다.

다음은 소프트 삭제된 모델중에 id 가 10 이상인 데이타를 가져오는 예제로 http://homestead.app/orm/soft-deleted-list 에 연결하여 결과를 확인할 수 있습니다.

public function getSoftDeletedList()
{	
    $tasks = Task::onlyTrashed()
        ->where('id', '>', 10)
        ->get();
    
    return response()->json($tasks, 
         200, [], JSON_PRETTY_PRINT);
}
CODE

 

소프트 삭제 복구

restore() 메소드로 소프트 삭제된 모델을 되살릴 수 있습니다. 다음은 소프트 삭제된 모델의 id 를 받아서 복구하는 예제로 데이타베이스에서 해당 레코드의 deleted_at 컬럼을 null 로 갱신하게 됩니다.

public function getRestoreSoftDelete($id)
{	
    $ret = Task::withTrashed()
        ->find($id)
        ->restore();
    
    return response()->json(['ret' => $ret], 
         200, [], JSON_PRETTY_PRINT);
}
CODE

 

영구 삭제

만약 소프트 삭제한 모델을 영구 삭제하고 싶은 경우 forceDelete() 를 호출하면 데이타베이스에서 영구적으로 삭제할 수 있습니다.

public function getForceDelete($id)
{	
   Task::withTrashed()
        ->find($id)
        ->forceDelete();
    
    return response()->json(['ret' => $ret], 
         200, [], JSON_PRETTY_PRINT);
}
CODE