CI 묻고 답하기

제목 sql 문 작성은 어떻게들 하시나요?
카테고리 CI 2, 3
글쓴이 하늘치 작성시각 2017/05/26 10:00:04
댓글 : 4 추천 : 0 스크랩 : 0 조회수 : 14506   RSS

처음 ci 를 접했을 때, 

controllers, libraries, models 등에서 select 문 작성할 때, 그 때 그 때 상황에 맞춰서 만들었던 기억이 납니다... 

 

 

시간이 좀 흐르고 난 후에는 다른 분들의 소스를 참고했습니다.

기본 모델(Common_model.php)에 get_common_result(), get_common_row() 등의 공통 함수를 만들어서 사용했구요.

 

	function get_common_result($sst=FALSE, $sod=FALSE, $sfl=FALSE, $stx=FALSE, $sql_select = FALSE, $sql_from = FALSE, $sql_where = FALSE, $sql_group_by = FALSE, $sql_order_by = FALSE, $limit=FALSE, $offset=0, $page=1) {

		$this->db->start_cache();
		if ( ! empty($sql_where))
		{
			$this->db->where($sql_where);
		}
		$this->db->stop_cache();
		$result['total_count'] = $this->db->count_all_results($sql_from);

		// Group by
		if ($sql_group_by)
		{
			$this->db->group_by($sql_group_by);
		}
		// Order by
		if($sst && $sod) 
		{
			$this->db->order_by($sst, $sod);
		}
		if ($sql_order_by)
		{
			$this->db->order_by($sql_order_by);
		}
		// Limit
		if ( ! empty($limit) )
		{
			$this->db->limit($limit, $offset);
		}
		// Set directly submitted SELECT and WHERE clauses.
		if ( ! empty($sql_select))
		{
			$this->db->select($sql_select);
		}
		$result['qry'] = $this->db->get($sql_from)->result();
		$this->db->flush_cache();

		return $result;
	}

 

물론, 처음에는 더 간단했지요.

그데, 이렇게 사용하다보니, 자꾸 하나씩 하나씩 덧붙이게 되더라구요.

위에 있는 것만해도 조인이 있는 경우, 사용할 수 없지요;;; 

 

 

그래서 생각했던 게..

	function get_arr_result($sql_from=FALSE, $sql_select='*', $sql_arr=FALSE) {

		foreach($sql_arr as $key => $val)
		{
			if('where' === $key){
				$this->db->start_cache();
				$this->db->where($val);
				$this->db->stop_cache();

				//$result['total_count'] = $this->db->count_all_results($sql_from);
			}
			elseif('group_by' === $key){
				$this->db->group_by($val);
			}
			elseif('order_by' === $key){
				$this->db->order_by($val);
			}
			elseif('limit' === $key){
				$this->db->limit($val);
			}
			elseif('join' === $key){

				$arr_join = $val;
				$this->db->join( $arr_join['join_table'], $arr_join['join_on'], $arr_join['join_opt']); 
			}

		}


		// Set directly submitted SELECT and WHERE clauses.
		if ( ! empty($sql_select))
		{
			$this->db->select($sql_select);
		}
		$result['qry'] = $this->db->get($sql_from)->result();
		$this->db->flush_cache();

		return $result;
	}

 

사용은..

	$result = array();
	$sql_from = 'board as b';
	$sql_select = 'idx, subject';
	$sql_arr = array(
		'where' => array('idx'=>$idx),
		'join' => array('join_table'=>'files as f', 'join_on'=>'f.bbs_fk = b.idx', 'join_opt'=>'left outer'),
		'limit' => 3,
		'order_by' => 'b.idx DESC'
	);
	$result = $this->Common_model->get_arr_result($sql_from, $sql_select, $sql_arr);
	$count = $this->Common_model->get_arr_count($sql_from, $sql_select, $sql_arr);
	$result['total_count'] = $count;

 

 

이런 식으로 사용하면 어떨까 싶었습니다.

아, 물론 위에서는 조인을 사용할 경우, $result['total_count'] 값이 문제가 되더군요;;

문제가 되면 빼버리면 되니까요 뭐.. ㅎㅎ ^^;

암튼, 이렇게 만들어놓으면, 확장성이랄까요.. 좀 좋은 듯 해서요.

 

혹시 더 멋진 방법이 있다면 공유해주세요~ ^^

 

 

 

덧.

찬찬히 다시 보니, 굳이 이렇게 쓸 필요가 없기도 하겠군요;;

그냥 상황에 맞춰 액티브 레코드를 사용하는 게 제일 맘편한건지도 모르겠스니다.

헛헛..

 

 

 다음글 foreach 문 입니다. 제가 작성한 코드보다 더 간... (3)
 이전글 페이지네이션에서 뒤에 처리 (1)

댓글

변종원(웅파) / 2017/05/26 13:52:28 / 추천 0

튜닝의 끝은 순정이다라는 명언이 있습니다. ^^

모델은 공용화하지 않고 사용합니다. 같은 기능이면 그 함수를 이용하는 정도로

또는 약간의 분기 정도 처리하는 정도로 사용합니다. (그래야 유지보수가 편합니다)

한대승(불의회상) / 2017/05/26 14:53:21 / 추천 0

정년 보신다면 튜닝 끝을 볼 수 있을것 같군요.

 

jcoop / 2017/05/27 22:42:33 / 추천 0
sql일반 select, update,delete정도 해봤습니다. 회원가입부분으로요. 
하늘치 / 2017/05/29 13:01:36 / 추천 0

변종원// 튜닝의 끝은 순정이다.. 과연 명언이로군요.

한대승// 정말, 정년까지 쭈욱 일하고 싶네요.ㅎㅎ

jcoop// 제가 글에서처럼 고민했던 주된 이유가.. 아마도 검색이나, 페이징 때문이었지 싶어요. ㅎㅎ