모델 삽입(Insert)

Eloquent 를 사용하여 모델 클래스를 테이블 레코드로 삽입하는 것은 매우 간단합니다. 먼저 테이블과 매핑되는 모델 인스턴스를 생성한 후에 모델의 프로퍼티에 값을 할당해 주고 save() 메소드를 호출해 주면 됩니다.

public function getInsert()
{
	$task = new Task;

	$task->name = '예제 작성';
	$task->project_id = 1;
	$task->description = 'insert 예제 작성';

    $ret = $task->save();

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

위 코드는 아래와 같은 SQL 로 만들어지며 성공적으로 save() 가 수행되면 리턴값은 모델 객체가 되며 생성된 기본 키는 모델 객체의 $task->id 에 담기게 됩니다.

insert into `tasks` (`name`, `project_id`, `description`, `updated_at`, `created_at`) values ('예제 작성', '1', 'insert 예제 작성', '2015-07-21 13:10:01', '2015-07-21 13:10:01');
CODE

이제 브라우저로 http://homestead.app/orm/insert 에 연결해 보면 정상적으로 모델이 삽입되고 기본 키(예: 24)가 생성되었음을 확인할 수 있습니다.

모델 갱신(Update)

모델 갱신은 삽입과 동일하며 차이점은 사전에 갱신할 모델을 테이블에서 가져오는 점입니다.

public function getUpdate($id)
{
    $task = Task::find($id);

    // 정보 갱신
    $task->name = '갱신 - 예제 작성';
    $task->project_id = 1;
    $task->description = '갱신 - insert 예제 작성';
    
    $ret = $task->save();
    return response()->json(['result' => $ret, 'task' => $task],
	    	 200, [], JSON_PRETTY_PRINT);
}
CODE

URI 에서 파라미터로 기본 키 값을 받아서 이 값으로 find() 메소드로 모델을 가져온 후에 변경할 프로퍼티를 갱신하고 save() 로 데이타 베이스에 반영하면 됩니다.

 

위 코드는 다음과 같이 두 개의 SELECT와 UPDATE SQL 로 변환이 되며 updated_at 컬럼은 자동으로 현재 시간으로 설정됩니다.

select * from `tasks` where `tasks`.`id` = '23' limit 1;
update `tasks` set `name` = '갱신 - 예제 작성', `description` = '갱신 - insert 예제 작성', `updated_at` = '2015-07-21 13:32:57' where `id` = '23';
SQL

생성된 UPDATE SQL 을 보면 $task->project_id = 1; 을 수행했지만 SQL에는 project_id 컬럼이 빠져있는 것을 알 수 있습니다.

 

이는 프로퍼티에 값을 할당했어도 기존 값과 차이가 없으므로 Eloquent ORM 이 UPDATE SQL 생성시 제외한 것입니다.

 

모델 갱신은 또는 아래처럼 where() 나 find() 메소드를 호출한 후에 메소드 체이닝을 사용하여 update() 를 호출하여 처리할 수 있으며 변경할 파라미터의 key/value 를 배열로 전달하면 됩니다.

public function getUpdate2($id)
{
    $param = [
        'name' => '갱신 - 예제 작성',
        'project_id' => 1,
        'description' => 'insert 예제 작성',
       ];
	
	// 갱신전 모델
	$before = Task::find($id);
 
    $ret = Task::find($id)->update($param);
	
	// 갱신후 모델
	$after = Task::find($id);
    return response()->json(['result' => $ret, 'before' => $before, 'after' => $after],
	    200, [], JSON_PRETTY_PRINT);
}
CODE

위 코드는 아래와 같은 SQL 로 변환이 되며 SELECT 를 수행하지 않고 WHERE 조건에 대상이 되는 모델을 넣으므로 쿼리를 한 번만 수행하므로 속도가 빠른 장점이 있습니다.

update `tasks` set `name` = '갱신 - 예제 작성', `project_id` = '1', `description` = 'insert 예제 작성', `updated_at` = '2015-07-21 13:53:25' where `id` = '23';
SQL

 

하지만 웹 브라우저로 http://homestead.app/orm/update2/24 연결하여 결과를 보면 의도한 대로 갱신되지 않고 아래와 같은 예외가 발생할 것입니다.

에러 메시지를 보면 MassAssignmentException 예외가 발생하여 모델 삽입에 실패했고 대상 컬럼은 name 이라는 것을 짐작할 수 있습니다.