ThinkPHP에서의 데이터 조작: 삽입, 삭제, 수정, 조회

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 출력

태그: ThinkPHP PHP 데이터베이스 CRUD 모델

7월 10일 05:42에 게시됨