1. 데이터 객체 생성
폼을 통해 제출된 데이터를 기반으로 모델 객체를 생성할 수 있다.
$userModel = M('User'); // User 모델 인스턴스화
$userModel->create(); // POST 데이터를 기반으로 자동으로 데이터 객체 생성
2. 데이터 삽입
새로운 레코드를 데이터베이스에 추가하려면 add() 메서드를 사용한다. 이 메서드는 삽입된 행의 기본 키 값을 반환한다.
$userModel = M('User');
$data = [
'name' => 'ThinkPHP',
'email' => 'thinkphp@example.com'
];
$primaryKey = $userModel->add($data);
if (!$primaryKey) {
echo '데이터 삽입 실패';
}
3. 데이터 삭제
delete() 메서드는 삭제된 레코드 수를 반환한다. 만약 조건 없이 호출되면 아무 작업도 수행하지 않아 실수로 전체 데이터를 지우는 것을 방지한다.
$userModel = M('User');
$userModel->delete(1); // ID가 1인 레코드 삭제
$userModel->where('status = 0')->delete(); // 상태가 0인 모든 사용자 삭제
모든 레코드를 삭제하려면 명시적으로 조건을 주어야 한다.
$userModel->where('1')->delete(); // 전체 데이터 삭제 (주의 필요)
예제: 연관 테이블 처리
예제 1: 계층적 삭제 (CASCADE)
입고 마스터 테이블(StockIn)과 상세 테이블(StockInDetail) 간 외래키 관계에서, 마스터 삭제 시 관련 상세 정보도 함께 삭제해야 할 경우 트랜잭션을 사용한다.
$master = M('StockIn');
$detail = M('StockInDetail');
$master->startTrans();
$result1 = $detail->where(['stockinid' => ['in', $ids]])->delete();
$result2 = $master->where(['id' => ['in', $ids]])->delete();
if ($result1 === false || $result2 === false) {
$master->rollback();
return false;
} else {
$master->commit();
}
예제 2: 삭제 제한 조건
특정 입고 내역에 상세 항목이 존재하면 삭제를 막는 로직.
$details = D('StockInDetail')->where(['stockinid' => $id])->find();
if ($details) {
echo '상세 데이터가 존재하여 삭제 불가';
}
또는 상태 값에 따라 삭제 가능 여부를 판단.
$blocked = M('StockIn')->where([
'id' => ['in', $ids],
'status' => ['gt', 0]
])->count();
if ($blocked > 0) {
echo '진행 중인 건은 삭제할 수 없습니다.';
}
예제 3: 다중 삭제
배열로 전달받은 여러 ID에 대해 일괄 삭제.
$ids = [1, 2, 3];
$result = M('StockIn')->where(['id' => ['in', $ids]])->delete();
4. 데이터 수정
save() 메서드를 사용해 조건에 맞는 레코드를 업데이트한다. 영향 받은 행 수를 반환하며, 실패 시 false를 리턴하므로 정확한 비교가 필요하다.
$userModel = M('User');
$updateData = [
'name' => 'New Name',
'email' => 'new@example.com'
];
$result = $userModel->where('id = 5')->save($updateData);
if ($result === false) {
echo '업데이트 실패';
}
5. 데이터 조회
5.1 단일 레코드 조회 (find)
find()는 조건에 맞는 첫 번째 레코드를 연관 배열로 반환한다. 실패 시 false, 결과 없으면 null.
$user = M('User')->where('status=1 AND name="thinkphp"')->find();
dump($user);
5.2 다중 레코드 조회 (select)
select()는 여러 행을 2차원 배열로 반환한다.
$list = M('User')
->where('status=1')
->order('create_time ASC')
->limit(10)
->select();
5.3 특정 필드 값 추출 (getField)
특정 컬럼의 값을 가져올 때 유용하다.
- 단일 값:
$nickname = M('User')->where('id=3')->getField('nickname');
- 전체 열 (1차원 배열):
$idList = M('User')->getField('id', true); // [1, 2, 3, ...]
- 키-값 쌍 (연관 배열):
$map = M('User')->getField('id,nickname'); // [1 => 'Tom', 2 => 'Jerry']
- 갯수 제한:
$limited = M('User')->getField('id,name', 5); // 최대 5개
SQL 디버깅
최종 실행된 SQL 문을 확인하여 디버그할 수 있다.
$model = M('User');
$model->where('id=3')->getField('nickname');
echo $model->getLastSql(); // 실제 실행된 SQL 출력