티스토리 뷰

개요

PhalconModel 기반의 매우 편리한 ORM을 제공한다. 백그라운드가 되는 로우 레벨에서는 PDO 클래스(Java 진영의 JDBC와 같은 개념)를 이용하여 데이터베이스에 대한 CRUD를 수행한다. 이번 글에서는 Phalcon을 이용한 RAW 쿼리문을 호출하는 방법을 설명하고자 한다.

MySQL 오브젝트 생성

$di = new \Phalcon\DI\FactoryDefault();
$di->set('db', function () {
    return new \Phalcon\Db\Adapter\Pdo\Mysql(
        array(
            "host" => "localhost",
            "port" => 3306,
            "username" => "username",
            "password" => "password",
            "dbname" => "dbname",
            "options" => array(
                PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'",
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ
            )
        )
    );
});
$app = new \Phalcon\Mvc\Micro($di);
  • MySQL 서버에 접속하기 위해 \Phalcon\Db\Adapter\Pdo\Mysql 오브젝트를 생성하고 DI에 추가한다.


  • PDO::ERRMODE_EXCEPTION을 설정하지 않으면 오류시 PDOException을 잡아낼 수 없다. 반드시 활성화한다.

  • PDO::FETCH_OBJ을 설정하면 SELECT 쿼리문 실행시 결과 로우를 단순 배열이 아닌 오브젝트로 받을 수 있다.

  • 생성한 MySQL 오브젝트는 Phalcon의 라이프 사이클 전역에서 참조할 수 있다. 예를 들어 \Phalcon\Mvc\Controller를 상속한 오브젝트에서는 $this->di->get('db')와 같이 오브젝트에 참조할 수 있다.


  • use($app)를 사용한 클로저 핸들러에서는 $app->db로 참조할 수 있다.


RAW 쿼리 실행

RAW 쿼리는 아래와 같이 실행한다.

  • SELECT 문은 아래와 같이 실행한다.
/* @var $db Phalcon\Db\Adapter\Pdo\Mysql */
$db = $app->db;

// SELECT 쿼리문을 실행
$users = $db->query('SELECT * FROM users')->fetchAll();

// Prepared Statements를 적용한 쿼리문을 실행, SQL 인젝션을 방지
$users = $db->query(
    'SELECT * FROM users WHERE id = ?',
    array(
        256
    )
)->fetchAll();
  • SELECT를 제외한 INSERT, UPDATE, DELETE 문은 아래와 같이 실행한다.
// 결과 로우를 가져오지 않는 쿼리문(INSERT, UPDATE, DELETE)는 execute() 호출
$db->execute(
    'INSERT INTO users SET id=?, name=?',
    array(512, 'Json')
);
print $db->affectedRows(); // 1

// Named Parameter 방식으로 실행시 executePrepared() 호출
$db->executePrepared(
    $db->prepare('INSERT INTO users SET id=:id, name=:name'),
    array(
        "id" => 512,
        "name" => 'Json'
    ),
    array(
        "id" => Phalcon\Db\Column::BIND_PARAM_INT,
        "name" => Phalcon\Db\Column::BIND_PARAM_STR
    )
);
print $db->affectedRows(); // 1

Model 기반의 ORM 적용

이제 Phalcon의 진정한 무기인 Model 기반의 ORM을 보여줄 차례이다. 아래와 같이 Users라는 이름의 모델 클래스를 작성한다.

<?php

class Users extends \Phalcon\Mvc\Model
{
    public function getSource()
    {
        // 실제 데이터베이스 상의 테이블명을 반환
        return "GDN_Users";
    }

    public function initialzie()
    {
        // DI 상에 mysql_db라는 이름의 PDO 오브젝트를 통해 데이터베이스에 연결, db라는 이름 하나만 있을 경우 생략 가능
        $this->setConnectionService('mysql_db');
    }
}
  • ORM을 사용하기 위한 준비는 딱 2개이다. 첫째, DI 상에 db라는 이름의 \Phalcon\Db\Adapter\Pdo 오브젝트가 존재해야 한다. 앞서 우리는 이 준비를 마쳤다. 둘째, 각 테이블에 대응하는 Model 클래스를 작성해야 한다. 나머지는 Phalcon이 모두 알아서 해준다.
  • 이제 아래와 같이 CRUD를 맛보자. 정말 간단해진다.
// id가 1인 로우를 조회
$user = Users::findFirst(1);

// Name 필드값을 jsonobject로 변경
$user->Name = 'jsonobject';

// 변경한 내용을 저장
$user->save();

참고 글

댓글
댓글쓰기 폼