// 기존 library load항목에 'queryParser' 추가 $autoload['libraries'] = array( ... , 'queryParser');
QueryParser는 CI의 Model Layer에서 호출하여 사용 할 수 있도록 설계되어 있다.
XML문서는 기본적으로 다음과 같이 작성한다
<?xml version="1.0" encoding="UTF-8" ?> <!--SQL 그룹 및 namespace 정의, 현재 QueryParser에서 namespace 는 활용하지 않음 --> <mapper namespace="sql.product"> <!-- 개별 SQL문 지정, id는 실제 프로그램에서 query를 불러 올 때 지정하는 key 값으로, 동일 XML파일 내에서 중복되지 않도록 주의가 필요하다 --> <sql id="get_price_change_history"> ... query ... </sql> </mapper>
<?xml version="1.0" encoding="UTF-8" ?> <mapper namespace="sql.product"> <sql id="get_price_change_history"> call xone_ktk_new.sp_s_sss1101_30_Search ( #{company} , '30' , #{brand} , #{style} , '' , #{page} , #{rows} ) </sql> </mapper>
$data['param1'] = '1234'; $data['param2'] = 1234; $data['param3'] = '테스트1'; $data['param4'] = '테스트2'; $data['param5'] = null;
// 요청 CALL sp_1(#{param1}, #{param2}, #{param3}, '#{param4}', #{param5}, #{param6}); // 결과 CALL sp_1('1234', 1234, '테스트1', '테스트2', NULL, NULL);
<sql id="sample.1"> SELECT * FROM table WHERE type = #{type} <if test="#{userId} != ''"> AND userId = #{userId} </if> <if test="#{empNo} != ''"> AND empNo = #{empNo} </if> </sql>
$data['type'] = 'T001'; $data['empNo'] = 2017062201; parse('sample.1', $data);
SELECT COUNT(1) AS cnt FROM TABLE WHERE TYPE = 'T001' AND empNo = 2017062201
<sql id="sample.2.list"> SELECT * FROM table WHERE <include refid="sample.2.where" /> </sql> <sql id="sample.2.count"> SELECT count(1) AS cnt FROM ( <include refid="sample.2.list" /> ) t </sql> <ref id="sample.2.where"> type = #{type} <if test="#{userId} != ''"> AND userId = #{userId} </if> <if test="#{empNo} != ''"> AND empNo = #{empNo} </if> // 부등호 등의 식은 CDATA 를 사용하여 태그로 인식되지 않도록 보호한다. <![CDATA[ AND regdate >= #{regdate} ]]> </ref>
SELECT * FROM TABLE WHERE TYPE = 'T001' AND empNo = 2017062201
SELECT COUNT(1) AS cnt FROM ( SELECT * FROM TABLE WHERE TYPE = 'T001' AND empNo = 2017062201 ) t
function __construct() { parent::__construct(); // 생성자에서 product.xml을 호출하여 모든 method가 별도 선언 없이 XML 내 쿼리를 사용 할 수 있도록 함 $this->queryparser->load("product"); }
function someMethod() { $this->usersQuery = $this->queryparser->load("user"); }
Model에서 아래와 같이 KTK_Model 을 extends 할 경우에는 아래와 같이 간결하게 사용 할 수 있다.
// parsing 할 데이터 임시 생성(예제용) $data['page'] = 1; $data['rows'] = 15; // $data를 이용, get_price_change_history 분석 후 퀴리 실행 $query=$this->query("get_price_change_history", $param); // 만약 대상 DB가 $this->db가 아닐 경우, 아래와 같이 manual하게 대상 DB를 선택 할 수 있음 (conf의 DB 이름 기준) // $query=$this->query("get_price_change_history", $param, 'DB1'); $result['list'] = $query->result_array();
// $data를 이용, get_price_change_history 분석 후 퀴리 실행 (대상 DB 명시 선택) $query=$this->queryparser->query("get_price_change_history", $data, 'DB1'); $result['list'] = $query->result_array();
위에서 기술한 바와 같이 바로 DB호출이 아닌 해석된 Query문을 String으로 받을 수 있다.
// $data를 이용, 기존 로드된 XML의 id='get_price_change_history' SQL을 해석하여 바인딩 $query = $this->queryparser->parse('get_price_change_history', $data); // 퀴리 실행하여 결과 바인딩 $query = $this->db->query($query); $result['list'] = $query->result_array();