CI 묻고 답하기

제목 디비 셀렉트 질문입니다.
글쓴이 방문넷 작성시각 2014/02/19 04:48:55
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 12999   RSS
아... 당췌 제가 머리가 안돌아가서 구글링과 코쟁이아저씨들의 문서 마구마구 읽어주시고.
삽질한지 3시간만에 원하는 결과물을 뽑아주긴했는데 이게 상당히 코드가 맘에 안들더라구요....

컨트롤러
  public function read_all() {
   $data['page'] = 'language_list_v';
   //모든언어 셀렉트
   $data['languages'] = $this->language_m->read_all();
   //기본 언어 셀렉트
   $data['default_list'] = $this->language_m->read_default();
   //국가 셀렉트
   $data['nations'] = $this->language_m->get_nations();
   //옛다~ 뷰~
   $this->load->view('layouts/default',$data);
  }
 모델
                function read_all() {
   $this->db->select('*');
   $nations = $this->db->get('nations')->result();

   foreach($nations as $nation) {
    $this->db->select('*');
    $this->db->where('lang',$nation->na_name);
    $languages = $this->db->get('languages')->result();
    $result[$nation->na_name]=$languages;
   }
   
   if ($result !== FALSE){ 
    return $result;
   } else {
    return FALSE;
   }
  }

  function read_default() {
   $this->db->select('*');
   $this->db->where('lang',config_item('language'));
   $query = $this->db->get('languages');

   if ($query->num_rows() >= 1){ 
    return $query->result();
   } else {
    return FALSE;
   }
  }

  function set_lang($nation) {
   //캐시를 재작성한다.
   $this->db->select('*');
   $this->db->where('lang',$nation);
   $query = $this->db->get('languages');
   
   if ($query->num_rows() >= 1){ 
    return $query->result();
   } else {
    return FALSE;
   }
  }

  function get_nations() {
   $this->db->select('*');
   $query = $this->db->get('nations');

   if ($query->num_rows() >= 1){ 
    return $query->result();
   } else {
    return FALSE;
   } 
  }

<div class="container">
 <div class="row">
  <div class="span2">
   <ul class="nav nav-list well">
    <li class="nav-header">다국어관리</li>
    <li><a href="http://<?php echo config_item('base_domain')?>/admin/language/read_all">다국어리스트</a></li>
    <li><a href="#">다국어추가</a></li>
    <li><a href="#">국가추가</a></li>
   </ul>
  </div>
  <div class="span10">
   <ul class="breadcrumb">
   <?php 
    $crumb = $this->uri->uri_string();
    $crumb = explode("/", $crumb);
    foreach($crumb as $key) {
     echo "<li><a href=\"#\">".$key."</a></li>";
    }
   ?>
   </ul>
   
   <p>현재 도메인 기본언어 :</p> 
   <pre><?php echo $this->multi_lang->check_nation()?></pre>

   <p>세션에 현재 언어 :</p> 
   <pre><?php echo $this->session->userdata('language')?></pre>
   <div id="contacts">
    <table class="table table-bordered">
     
     <thead>
      <tr>
       <th colspan="3">
        <input type="text" class="search span7" placeholder="Search contact" />
       </th>
      </tr>
      <tr>
       <th class="sort" data-sort="key">KEY</th>
       <th class="sort" data-sort="value">VALUE</th>
       <th>edit</th>
      </tr>
     </thead>
     <tbody class="list">
     <?php foreach($default_list as $entry) {?>
      <tr>
       <td class="key" style="word-break: break-all;"><?php echo $entry->key ?><span style="display:none"><?php echo $entry->type ?></span></td>
       <td class="value">
        <?php 
         foreach($nations as $nation) {
          foreach($languages[$nation->na_name] as $lang_entry) {
           if($entry->key == $lang_entry->key) {
        ?>
         <div class="control-group small">
          <div class="input-prepend">
           <span class="add-on"><?php echo $lang_entry->lang?></span>
           <input class="span5" type="text" value="<?php echo $lang_entry->value?>">
          </div>
         </div>
        
        <?php
           }
          }
         }
        ?>
       </td>
       <td>
        <a href="#" class="btn"><span class="fui-check"></span></a>
        <a href="#" class="btn"><span class="fui-trash"></span></a>
       </td>
      </tr>
     <?php } ?>
     </tbody>
    </table>
    <table class="rwd-table">
     <tr>
      <td>
       <h3>모바일에선 다국어 수정이 불가피 합니다.</h3>
      </td>
     </tr>
    </table>
     <div class="pagination">
      <ul class="pagination_2"></ul>
     </div>
   </div>
   <p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds</p>
  </div>
 </div>
</div>
<script>
 var options = {
  valueNames: [ 'type','key','value' ],
  page: 10,
  plugins: [ ListPagination({}) ] 
 };

 // Init list
 var contactList = new List('contacts', options);
</script>


딱봐도 너무 무분별 하게 foreach를 연속으로 잡아 돌리고 있습니다. 이거를 좀더 유연하게 DB쿼리로 해결할 방도를 찾고있는데 역시 디비에서 제가 한없이 작아지네요;;; 

디비 구조는

nations (idx, name)
languages (idx, nation, type, key, value)

요로쿵 했습니다 아 languages 의 type은 그냥 제가 디비에서 찾기쉽게 키워드용으로 해둔겁니다..

저의 이 갈증을 해소시켜주시면 감사하겠습니다 꾸벅 (--)(__)
 다음글 ci 이용하여 개인 홈페이지 제작중입니다. 네이버 블로... (3)
 이전글 DB에서 읽은 값이 VIEW에 나타나지 않을 때 (5)

댓글

taegon / 2014/02/19 09:43:34 / 추천 0
 nations의 idx를 languages에 추가하셔서 join하시면 될 것 같은데... 
저렇게 select 각각 하나씩 해오시는 이유라도?..
방문넷 / 2014/02/19 16:49:52 / 추천 0
teagon // 디비쪽은 제가 영 많이 약해서요 ㅎㅎ;; 다른 방법으로 해결 보았습니다 코드가 심각하게 깔끔해졌네요;;;