질문Q #7859
[AR] fld = fld + 1
마냐2009-07-30 16:38:49
// 일반 쿼리		
$wr_hit = $this->db->protect_identifiers('wr_hit');
$sql = 'update K_write set '.$wr_hit.' = '.$wr_hit.' + 1 where bo_table = ? and wr_id = ?'; 
$this->db->query($sql, array($bo_table, $wr_id));

// Active Record
$this->db->set('wr_hit', 'wr_hit + 1', false);
$this->db->update('K_write', null, array('bo_table' => $bo_table, 'wr_id' => $wr_id));
답변3
#1 ci세상 2009-07-30 18:18:02

감사합니다.^^

자바개발자들이 CI 엑티브 레코드보고 감탄을 하던데요~~ 전 그냥 써보기만 해서 감사한지도 모르구요;;

일반쿼리에서 안되는 것이 혹시 어떤것들이 있을까요?

외국 위키에 가보면 엑티브 레코드 패치들이 계속 버젼업되는것 같더라구요^^

#2 변종원(웅파) 2009-07-30 21:14:12
like, orlike, where절 섞어쓸때 구현이 안되서 $sql ="...."; 로 처리한적이 있습니다.
그때 빼고는 복잡한 조인, 서브쿼리 등등 대부분 엑티브레코드로 사용합니다.
물론 귀찮아서 그냥 쓴적도 있구요. ㅋ
#3 마냐 2009-07-31 00:56:03

select ... from where fld = 1 and (fld = 2 or fld = 3) and fld =  4

위와 같이 () 로 묶는 쿼리를 할때 잘 안되더군요.

or_where을 하면 이렇게 됩니다.
select ... from where fld = 1 and fld = 2 or fld = 3 and fld =  4

그럴때는
$where = "  fld = 1 and (fld = 2 or fld = 3) and fld =  4 ";
$this->db->where($where, null, false);

해버리면 됩니다. ㅡ_

Active Record 는 필드나 테이블명을 백틱(`)으로 감싸는 본능(?)이 있습니다.
그걸 false 해주는 거죠. 그럼 끝.

왠만한건 false 옵션 주면 다 해결됩니다.

보안을 생각하여 식별자 보호와 이스케이프를 수동으로 해야하는 귀차니즘이..
$this->db->protect_identifiers
$this->db->escape