액티브 레코드(Active Record Class)
CodeIgniter 는 수정된 형태의 액티브레코드 데이터베이스 패턴(Active Record Database Pattern)을 사용합니다. 이 패턴은 정보의 추출,삽입, 업데이트를 최소한의 코드로 수행할수 있게 해줍니다. 때에따라서 한두줄의 코드만으로 원하는 처리를 할수도 있습니다. 또한 , 각 데이터베이스 테이블이 그 자신의 클래스에 반드시 존재할 필요도 없습니다. CodeIgniter 는 보다 간단한 인터페이스를 제공합니다.
단순성 보다 더 중요한 장점은 바로 데이터베이스에 독립된 프로그램을 만들 수 있다는 점입니다. 액티브레코드는 사용하는 데이터베이스 어댑터에 맞게 쿼리를 자동으로 생성합니다. 게다가, 자동으로 값들을 이스케이프(escape)하기 때문에 보다 안전한 쿼리를 만들어 냅니다.
Note: 쿼리를 직접 작성하여 사용하고자한다면, 데이터베이스 설정파일에서 액티브레코드를 비활성(disable)화 시킬수 있습니다. 그렇게 하면 코어 데이터베이스 라이브러리및 어댑터를 사용할때 리소스를 절약할 수 있습니다..
- 데이터조회 (Selecting Data)
- 데이터 삽입( Inserting Data)
- 데이터 업데이트 (Updating Data)
- 데이터 삭제 (Deleting Data)
- 함수 연결 (Method Chaining)
- 액티브레코드 캐싱 (Active Record Caching)
데이터 조회 (Selecting Data)
다음 함수들은 SQL SELECT 문을 생성할수 있도록 해줍니다.
알림: PHP 5 에서는 함수 연결(method chaining)을 사용하여 좀더 단순한 문법을 사용할 수 있습니다.이 방법은 본 페이지의 맨 아래 에 있습니다.
$this->db->get();
조회 쿼리를 수행하며 결과를 리턴합니다.함수 그자체를 사용하면 모든 레코드를 가져오는 쿼리를 자동으로 실행합니다.:
$query = $this->db->get('mytable');
// 생성결과: SELECT * FROM mytable
두번째, 세번째 파라미터는 리미트(limit)와 오프셋(offset)을 설정하는데 사용됩니다.:
$query = $this->db->get('mytable', 10, 20);
// 생성결과: SELECT * FROM mytable LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)
위 함수에서는 결과를 $query변수에 할당하며 , 아래와 같이 활용할수 있습니다.:
$query = $this->db->get('mytable');
foreach ($query->result() as $row)
{
echo $row->title;
}
쿼리결과생성(result functions) 페이지를 참조하시면 좀더 자세한 정보가 있습니다..
$this->db->get_where();
$db->where() 함수 대신 where 절을 두번째 파라미터로 사용할수 있다는 점을 빼면 위의 함수와 동일합니다.:
$query = $this->db->get_where('mytable', array('id' => $id), $limit, $offset);
아래쪽에 있는 where 함수의 내용을 보시면 더 자세한 정보를 얻으실 수 있습니다.
Note: get_where() 함수는 이제는 더이상 사용하지않는 getwhere()의 새로운 이름입니다.
$this->db->select();
쿼리에서 SELECT 부분을 직접 입력할수 있도록 해 줍니다:
$this->db->select('title, content, date');
$query = $this->db->get('mytable');
// 생성결과: SELECT title, content, date FROM mytable
Note: 전부(*) 를 조회할때는 이 함수가 필요없습니다. 파라미터가 생략되면 CodeIgniter 는 자동으로 SELECT * 를 수행합니다.
$this->db->select() 함수에서는 옵션으로 두번째 파라미터를 설정할 수 있습니다. 만약 FALSE 로 설정하면 CodeIgniter 는 필드나 테이블명을 백틱(`) 으로 감싸 보호하지 않습니다.복잡한 select 문을 사용할때 이것이 유용합니다.
$this->db->select('(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4') AS amount_paid', FALSE);
$query = $this->db->get('mytable');
$this->db->select_max();
"SELECT MAX(field)" 부분을 사용할 수 있게 합니다. 두번째 파라미터를 사용하면 결과값의 필드명을 다른 이름으로 바꿀 수 있습니다..
$this->db->select_max('age');
$query = $this->db->get('members');
// 생성결과: SELECT MAX(age) as age FROM members
$this->db->select_max('age', 'member_age');
$query = $this->db->get('members');
// 생성결과: SELECT MAX(age) as member_age FROM members
$this->db->select_min();
"SELECT MIN(field)" 부분을 사용할 수 있게 합니다.select_max()와 같이,두번째 파라미터를 사용하면 결과값의 필드명을 다른 이름으로 바꿀 수 있습니다.
$this->db->select_min('age');
$query = $this->db->get('members');
// 생성결과: SELECT MIN(age) as age FROM members
$this->db->select_avg();
"SELECT AVG(field)" 부분을 사용할 수 있게 합니다.select_max()와 같이,두번째 파라미터를 사용하면 결과값의 필드명을 다른 이름으로 바꿀 수 있습니다..
$this->db->select_avg('age');
$query = $this->db->get('members');
// 생성결과: SELECT AVG(age) as age FROM members
$this->db->select_sum();
"SELECT SUM(field)" 부분을 사용할 수 있게 합니다.select_max()와 같이,두번째 파라미터를 사용하면 결과값의 필드명을 다른 이름으로 바꿀 수 있습니다.
$this->db->select_sum('age');
$query = $this->db->get('members');
// 생성결과: SELECT SUM(age) as age FROM members
$this->db->from();
FROM 부분을 사용할 수 있게 합니다.:
$this->db->select('title, content, date');
$this->db->from('mytable');
$query = $this->db->get();
// 생성결과: SELECT title, content, date FROM mytable
Note: 앞서 보여준대로 , FROM 부분은 $this->db->get() 함수에서 정의해줄수 있습니다. 그러니까 위 함수를이용하거나 말거나는 당신의 선택입니다.
$this->db->join();
JOIN 부분을 사용할 수 있게 해줍니다.:
$this->db->select('*');
$this->db->from('blogs');
$this->db->join('comments', 'comments.id = blogs.id');
$query = $this->db->get();
// 생성결과:
// SELECT * FROM blogs
// JOIN comments ON comments.id = blogs.id
여러개의 조인을 단일쿼리에 사용할 경우 여러개의 함수호출(function calls)를 사용할 수 있습니다.
기본 조인(JOIN)외의 조인을 할때는 세번째 파라미터를 사용할 수 있습니다.
옵션은 다음과 같습니다: left, right, outer, inner, left outer, and right outer.
$this->db->join('comments', 'comments.id = blogs.id', 'left');
// 생성결과: LEFT JOIN comments ON comments.id = blogs.id
$this->db->where();
이함수는 4가지중 한가지 방법을 사용하여 WHERE절을 설정할수 있게 합니다:
주의: 이 함수로 전달되는 모든 변수는 자동으로 이스케이프 되어 안전한 쿼리를 생성합니다.
- 단순 키/값 방법:
$this->db->where('name', $name);
// 생성결과: WHERE name = 'Joe'같다(=) 부분을 자동으로 추가해줍니다.
이 방법을 여러번 사용하면 모두 AND 로 연결됩니다.:
$this->db->where('name', $name);
$this->db->where('title', $title);
$this->db->where('status', $status);
// WHERE name 'Joe' AND title = 'boss' AND status = 'active' - 사용자 키/값 방법:
첫번째 파라미터에 연산기호를 삽입하여 원하는 쿼리를 만들수 있습니다:
$this->db->where('name !=', $name);
$this->db->where('id <', $id);
// 생성결과: WHERE name != 'Joe' AND id < 45 - 연관배열 방법:
$array = array('name' => $name, 'title' => $title, 'status' => $status);
$this->db->where($array);
// 생성결과: WHERE name = 'Joe' AND title = 'boss' AND status = 'active'아래와 같이 직접 연산기호를 사용할 수도 있습니다.:
$array = array('name !=' => $name, 'id <' => $id, 'date >' => $date);
$this->db->where($array); - 사용자 문자열 방법:
아래와 같이 Where 절을 직접 입력할 수 도 있습니다:
$where = "name='Joe' AND status='boss' OR status='active'";
$this->db->where($where);
$this->db->where() 에는 세번째 파라미터가 옵션으로 제공됩니다. 이 파라미터를 FALSE 로하면 , CodeIgniter 는 필드나 테이블명을 백틱(`) 으로 감싸 보호하지 않습니다.
$this->db->where('MATCH (field) AGAINST ("value")', NULL, FALSE);
$this->db->or_where();
여러개의 조건들이 OR 로 연결되는것을 제외하면 본함수는 위의 함수와 동일합니다.:
$this->db->where('name !=', $name);
$this->db->or_where('id >', $id);
// 생성결과: WHERE name != 'Joe' OR id > 50
주의: or_where() 는 이제 더이상 사용하지않는 orwhere()의 새로운 이름입니다.
$this->db->where_in();
WHERE 절의 IN ('item', 'item') 부분을 생성하며 필요한 경우 AND 로 연결해줍니다.
$names = array('Frank', 'Todd', 'James');
$this->db->where_in('username', $names);
// 생성결과: WHERE username IN ('Frank', 'Todd', 'James')
$this->db->or_where_in();
WHERE 절의 IN ('item', 'item') 부분을 생성하며 필요한 경우 OR 로 연결해줍니다.
$names = array('Frank', 'Todd', 'James');
$this->db->or_where_in('username', $names);
// 생성결과: OR username IN ('Frank', 'Todd', 'James')
$this->db->where_not_in();
WHERE 절의 NOT IN ('item', 'item') 부분을 생성하며 필요한경우 AND 로 연결해줍니다
$names = array('Frank', 'Todd', 'James');
$this->db->where_not_in('username', $names);
// 생성결과: WHERE username NOT IN ('Frank', 'Todd', 'James')
$this->db->or_where_not_in();
WHERE 절의 NOT IN ('item', 'item') 부분을 생성하며 필요한경우 OR 로 연결해줍니다
$names = array('Frank', 'Todd', 'James');
$this->db->or_where_not_in('username', $names);
// 생성결과: OR username NOT IN ('Frank', 'Todd', 'James')
$this->db->like();
이 함수는 LIKE 절을 생성해줍니다. 검색시에 유용합니다..
Note: 전달된 모든값은 자동으로 이스케이프 됩니다.
- 단순 키/값 방법:
$this->db->like('title', 'match');
// 생성결과: WHERE title LIKE '%match%'이함수를 여러번 호출하면 각각을 AND 로 연결해줍니다:
$this->db->like('title', 'match');
like 절에서 와일드카드(%)를 사용해야 한다면 옵션인 세번째 파라미터를 사용할수 있습니다.
$this->db->like('body', 'match');
// WHERE title LIKE '%match%' AND body LIKE '%match%
옵션은 다음과같습니다:'before', 'after', 'both' (기본값).$this->db->like('title', 'match', 'before');
// 생성결과: WHERE title LIKE '%match'
$this->db->like('title', 'match', 'after');
// 생성결과: WHERE title LIKE 'match%'
$this->db->like('title', 'match', 'both');
// 생성결과: WHERE title LIKE '%match%' - 연관배열 방법:
$array = array('title' => $match, 'page1' => $match, 'page2' => $match);
$this->db->like($array);
// WHERE title LIKE '%match%' AND page1 LIKE '%match%' AND page2 LIKE '%match%'
$this->db->or_like();
본 함수는 여러개의 조건들이 OR 로 연결된 경우를 제외하고는 위함수와 같습니다.:
$this->db->like('title', 'match');
$this->db->or_like('body', $match);
// WHERE title LIKE '%match%' OR body LIKE '%match%'
Note: or_like() 는 이제 더이상 사용하지 않는 orlike()의 새로운 버전입니다.
$this->db->not_like();
NOT LIKE 문을 생성한다는 점을 제외하면 like()함수와 완전히 동일합니다.:
$this->db->not_like('title', 'match');
// WHERE title NOT LIKE '%match%
$this->db->or_not_like();
여러개의 조건들이 OR 로 연결된다는점을 제외하면 not_like()함수와 같습니다:
$this->db->like('title', 'match');
$this->db->or_not_like('body', 'match');
// WHERE title LIKE '%match% OR body NOT LIKE '%match%'
$this->db->group_by();
GROUP BY 부분을 생성합니다:
$this->db->group_by("title");
// 생성결과: GROUP BY title
여러개의 값을 전달하기위해서 배열도 사용할 수 있습니다.
$this->db->group_by(array("title", "date"));
// 생성결과: GROUP BY title, date
Note: group_by() 는 이제 더이상 사용하지 않는 groupby() 함수의 새버전 입니다.
$this->db->distinct();
쿼리에 "DISTINCT" 키워드를 추가합니다
$this->db->distinct();
$this->db->get('table');
// 생성결과: SELECT DISTINCT * FROM table
$this->db->having();
HAVING 부분을 생성합니다. 하나의 파라미터를 사용할수도 있고 두개의 파라미터를 사용할 수도 있습니다:
$this->db->having('user_id = 45');
// 생성결과: HAVING user_id = 45
$this->db->having('user_id', 45);
// 생성결과: HAVING user_id = 45
여러개의 값을 전달하기위해서 배열도 사용할 수 있습니다:
$this->db->having(array('title =' => 'My Title', 'id <' => $id));
// 생성결과: HAVING title = 'My Title', id < 45
CodeIgniter 자동으로 쿼리를 이스케이프 하는 데이터베이스(ex:Mysql)를 사용하고 있고 이 자동 이스케이프를 끄고싶다면, 세번째 파라미터를 FALSE 로 설정합니다. 아래 예제를 봐주세요 .
$this->db->having('user_id', 45);
// 생성결과: HAVING `user_id` = 45 in some databases such as MySQL
$this->db->having('user_id', 45, FALSE);
// 생성결과: HAVING user_id = 45
$this->db->or_having();
여러 조건을 OR 로 연결한다는 점을 제외하면 having()과 같습니다..
$this->db->order_by();
ORDER BY 부분을 생성합니다. 첫번째파라미터는 정렬기준이 되는 컬럼명입니다. 두번째 파라미터는 정렬 방향입니다. 정렬방향은 asc 나 desc, 혹은random 입니다
$this->db->order_by("title", "desc");
// 생성결과: ORDER BY title DESC
첫번째 파라미터로 직접문자열을 입력할수 있습니다:
$this->db->order_by('title desc, name asc');
// 생성결과: ORDER BY title DESC, name ASC
아니면 함수를 여러번 호출하여 여러 필드에 대한 정렬을 수행할수 있습니다.
$this->db->order_by("title", "desc");
$this->db->order_by("name", "asc");
// 생성결과: ORDER BY title DESC, name ASC
Note: order_by() 는 이제 더이상 사용하지 않는 orderby()함수의 새이름입니다.
Note: 랜덤(random)정렬은 현재 Oracle , MSSQL 에서는 사용할수 없습니다. 그러므로 해당 데이터베이스사용시 random은 자동으로 'ASC' 로 설정됩니다.
$this->db->limit();
쿼리결과로 리턴받을 열의 개수를 설정할때 사용합니다:
$this->db->limit(10);
// 생성결과: LIMIT 10
두번째 파라미터는 오프셋을 설정할때 사용합니다.
$this->db->limit(10, 20);
// 생성결과: LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)
$this->db->count_all_results();
특정 액티브레코드 쿼리를 통해 적용될 레코드의 수를 확인하도록 해줍니다.쿼리는 where(), or_where(), like(), or_like(), 등과같은 액티브레코드 한정자 들을 허용합니다. 예:
echo $this->db->count_all_results('my_table');
// Produces an integer, like 25
$this->db->like('title', 'match');
$this->db->from('my_table');
echo $this->db->count_all_results();
// Produces an integer, like 17
$this->db->count_all();
특정테이블의 레코드수를 리턴합니다. 첫번째 파라미터에는 테이브명이 들어갑니다. 예:
echo $this->db->count_all('my_table');
// Produces an integer, like 25
데이터 삽입(Inserting Data)
$this->db->insert();
당신이 제공한 데이터를 가지고 insert 쿼리를 생성한후 실행합니다. 이때 배열 혹은 객체를 사용하여 데이터를 제공합니다.다음은 배열을 사용한 예입니다:
$data = array(
'title' => 'My title' ,
'name' => 'My Name' ,
'date' => 'My date'
);
$this->db->insert('mytable', $data);
// 생성결과: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
첫번째 파라미터는 테이블명 ,두번째 파라미터는 필드명과 값을 포함한 연관배열 입니다.
다음은 객체를 사용한 예제입니다:
/*
class Myclass {
var $title = 'My Title';
var $content = 'My Content';
var $date = 'My Date';
}
*/
$object = new Myclass;
$this->db->insert('mytable', $object);
// 생성결과: INSERT INTO mytable (title, content, date) VALUES ('My Title', 'My Content', 'My Date')
첫번째 파라미터는 테이블 명이며, 두번째 파라미터는 값에대한 연관배열 형태의 객체입니다.
Note: 전달된 모든값은 자동으로 이스케이프되어 보다 안전한 쿼리로 생성됩니다.
$this->db->set();
이 함수는 입력(insert) 혹은 업데이트(update)시 값을 설정할수 있도록 합니다.
이 함수는 입력,업데이트시 데이터 배열을 사용하는 방법 대신 사용할 수 있습니다:
$this->db->set('name', $name);
$this->db->insert('mytable');
// 생성결과: INSERT INTO mytable (name) VALUES ('{$name}')
함수를 여러번 호출했을때는 입력인지 업데이트인지에 따라 적절하게 자동으로 연결해줍니디다:
$this->db->set('name', $name);
$this->db->set('title', $title);
$this->db->set('status', $status);
$this->db->insert('mytable');
set() 함수는 옵션으로 세번째파라미터($escape)를 받아들입니다.이 파라미터를 FALSE로 하면 쿼리를 자동으로 이스케이프 하지않습니다. 아래예제는 set() 함수를 호출할때 세번째 파라미터를 사용한것과 안한것을 비교하여 보여줍니다.
$this->db->set('field', 'field+1', FALSE);
$this->db->insert('mytable');
// gives INSERT INTO mytable (field) VALUES (field+1)
$this->db->set('field', 'field+1');
$this->db->insert('mytable');
// gives INSERT INTO mytable (field) VALUES ('field+1')
이함수를 사용할때 연관배열을 사용할 수도 있습니다:
$array = array('name' => $name, 'title' => $title, 'status' => $status);
$this->db->set($array);
$this->db->insert('mytable');
혹은 아래와같이 객체도 가능하구요:
/*
class Myclass {
var $title = 'My Title';
var $content = 'My Content';
var $date = 'My Date';
}
*/
$object = new Myclass;
$this->db->set($object);
$this->db->insert('mytable');
데이터 업데이트 (Updating Data)
$this->db->update();
제공된 데이터를 가지고 업데이트 쿼리를 생성하고 실행합니다. 당신은 배열혹은 객체를 사용하여 데이터를 전달할수 있습니다.
다음은 배열을 사용한 예입니다.:
$data = array(
'title' => $title,
'name' => $name,
'date' => $date
);
$this->db->where('id', $id);
$this->db->update('mytable', $data);
// 생성결과:
// UPDATE mytable
// SET title = '{$title}', name = '{$name}', date = '{$date}'
// WHERE id = $id
아래를 객체를 사용한 예입니다:
/*
class Myclass {
var $title = 'My Title';
var $content = 'My Content';
var $date = 'My Date';
}
*/
$object = new Myclass;
$this->db->where('id', $id);
$this->db->update('mytable', $object);
// 생성결과:
// UPDATE mytable
// SET title = '{$title}', name = '{$name}', date = '{$date}'
// WHERE id = $id
Note: 전달된 모든값은 자동으로 이스케이프 됩니다.
$this->db->where() 함수를 이용하면 WHERE 절을 사용할수 있다는것을 이미 아실겁니다. update 함수에서는 옵션으로 where 조건을 세번째 파라미터로 전달할 수 있습니다.:
$this->db->update('mytable', $data, "id = 4");
아래와같이 배열로도 전달할수 있구요 .:
$this->db->update('mytable', $data, array('id' => $id));
업데이트 시 $this->db->set() 함수도 사용할수 있습니다.
데이터 삭제 (Deleting Data)
$this->db->delete();
삭제 쿼리를 생성하고 실행합니다.
$this->db->delete('mytable', array('id' => $id));
// 생성결과:
// DELETE FROM mytable
// WHERE id = $id
첫번째 파라미터는 테이블 이름입니다. 두번째 파라미터는 where 절이구요.두번째 파라미터를 사용하는 대신에where() 나 or_where() 함수를 사용하여 where 절을 설정해도 됩니다.:
$this->db->where('id', $id);
$this->db->delete('mytable');
// 생성결과:
// DELETE FROM mytable
// WHERE id = $id
한개이상의 테이블에서 데이터를 삭제해야 한다면 여러개의 테이블명을 배열로 delete() 함수에 넘길 수 있습니다.
$tables = array('table1', 'table2', 'table3');
$this->db->where('id', '5');
$this->db->delete($tables);
테이블의 모든 데이터를 삭제하려면truncate() 혹은 empty_table() 함수를 사용하시면 됩니다.
$this->db->empty_table();
삭제 쿼리를 생성하고 실행합니다 $this->db->empty_table('mytable');
// Produces
// DELETE FROM mytable
$this->db->truncate();
truncate 쿼리를 생성하고 실행합니다.
$this->db->from('mytable');
$this->db->truncate();
// or
$this->db->truncate('mytable');
// Produce:
// TRUNCATE mytable
Note: TRUNCATE 명령이 사용불가능한 상황이라면 truncate() 함수는 "DELETE FROM table" 쿼리를 실행할것입니다.
함수연결(Method Chaining)
함수연결은 여러개의 함수를 연결하므로써 ,좀더 단순한 문법을 사용할 수 있게합니다.
아래예제를 살펴보세요 :
$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);
$query = $this->db->get();
Note: 함수연결은 PHP 5 에서만 사용합니다.
액티브레코드 캐싱 (Active Record Caching)
캐싱이"true"가 아닐지라도, 액티브레코드는 쿼리의 특정부분을 나중에 실행할때에 대비해 저장(혹은 캐시) 하도록 되어있습니다. 보통은, 액티브레코드 호출이 완료되면, 모든 저장된 데이터는 다음 호출을 위해서 리셋 됩니다. 캐싱을 하면, 이러한 리셋을 막고 데이터재사용을 쉽게 할수 있습니다
캐시된 호출은 누적됩니다.만약 2개의 캐시된 select() 호출과 2개의 캐시되지않은 select() 호출이 있다면, 4개의 select() 를 호출한 결과가 됩니다.캐시를 위한 함수는 3개가 있습니다:
$this->db->start_cache()
이함수는 캐싱을 시작하기 위하여 반드시 호출되어야 합니다. 캐싱이 지원되는 모든 액티브 레코드 쿼리는 나중을 위해서 저장됩니다.
$this->db->stop_cache()
이함수는 캐싱을 정지하기 위하여 호출합니다.
$this->db->flush_cache()
이함수는 액티브레코드 캐시로 저장된 모든 아이템을 제거합니다.
사용예:
$this->db->start_cache();
$this->db->select('field1');
$this->db->stop_cache();
$this->db->get('tablename');
//Generates: SELECT `field1` FROM (`tablename`)
$this->db->select('field2');
$this->db->get('tablename');
//Generates: SELECT `field1`, `field2` FROM (`tablename`)
$this->db->flush_cache();
$this->db->select('field2');
$this->db->get('tablename');
//Generates: SELECT `field2` FROM (`tablename`)
Note: 다음의 쿼리문은 캐시될수 있습니다: select, from, join, where, like, groupby, having, orderby, set