2011-11-07 2 views
0

데이터베이스 쿼리를 사용할 때 Model-View-Controller 설정을 처리 할 때 가장 좋은 코딩 방법은 무엇인지 궁금합니다. 나는Codeigniter 쿼리 또는 생성 된 쿼리 배열을 컨트롤러에 전달

컨트롤러

$query = $this->db->get(); 
$this->template->write_view('content', 'work/index', array('work_query' => $query)); 
$this->template->render(); 

보기

<?php if ($work_query->num_rows() == 0): ?> 
    <p>There are no works</p> 
<?php else: ?> 
    <?php foreach($work_query->result() as $work): ?> 
     //Do something 
    <?php endforeach; ?> 
<?php endif; ?> 

또는 내가 (쿼리 클래스의 일부 함수를 호출해야합니다 ...과 같이, 컨트롤러에 반환 된 쿼리를 통과해야 예 : result_array())보기로 전달합니다.

컨트롤러

$query = $this->db->get()->result_array(); 
$this->template->write_view('content', 'work/index', array('works' => $query)); 
$this->template->render(); 

보기

<?php if (empty($works)): ?> 
    <p>There are no works</p> 
<?php else: ?> 
    <?php foreach($works as $work): ?> 
     //Do something 
    <?php endforeach; ?> 
<?php endif; ?> 

하나가 더 나은 코딩 표준을 고려가요? 하나가 다른 것보다 효율적입니까?

+0

아무 것도 MVC 디자인 패턴과 관련이 없습니다. –

답변

2

pinadelsai가 이미 말했듯이, 로직은 사용자의 쿼리를 모델에 넣도록 지시합니다. 그 서버 2 목적 : 1) MVC를 bheind 세 논리를 분리하여 더 엄격하고 더 나은 코딩 관행을 mantain; 2) 쿼리를 변경하려는 날을 계획하고 쉽게 유지하십시오.
하나의 rendred 뷰에서 쿼리를 호출하는 것처럼 보입니다.하지만 한 번만 호출하면 어떤 일을 변경할지 결정할 수 있습니까? 모든보기를 확인하고 각각의보기를 변경해야합니다. 모델 내부의 로직을 유지함으로써 한 가지 방법 만 변경하면 수정 된 결과를 모든 뷰에 즉시 제공합니다.

작은 추가 및 조언 : 배열 결과를 배열 반환 함수로 호출 할 필요는 없습니다.) (당신이 결과를 (사용) 이상 result_array로 변경하기로 선택한 경우

$query = $this->db->get('mytable'); // this is your fetching; 
$data = array(); 
foreach($query->result() as $row) 
{ 
    $data[] = $row; 
} 
return $data; 

당신은 배열 형식에 항상 속성 ($ 데이터)에 상관없이이있을 것이다 : (모델)에 같은 일을 ; 당신의 뷰는 동일한 foreach 논리를 유지할 것이고, 배열 표기법이나 객체 표기법을 사용하여 값을 호출하는 방법 만 변경하면됩니다.


UPDATE :.

귀하의 의견에 따라, 당신도 당신이 아무 결과도 없다 (하지만 강력하게 당신의 디자인에 따라 달라집니다 경우에 다른 뷰를 사용하여 더 일반적으로, 당신은 모델 패스를하도록 할 수 있습니다 . 데이터 예에 대한 결과에 대한 양에 대한 정보 :. 행이 반환되는 경우, 상기 어레이 채운 이때

$query = $this->db->get('mytable'); // this is your fetching; 
    $data = array(); 
    if($query->num_rows() > 0) 
    { 
     foreach($query->result() as $row) 
     { 
     $data[] = $row; 
     } 
    } 
    return $data; 

빈 배열로 $data 시작, 그렇지 않으면 빈 반환 그 것처럼. 그런 다음 코드에서 이미 수행 한 것처럼이 조건을 차별화하는 방법을 결정합니다 (또는 컨트롤러에서 전체보기를로드해야하는 경우 컨트롤러에서 결정).


이 외에도 강제로 시행해야하는 강제 법이 없습니다. 그럼에도 불구하고 원하는 논리를 원하는대로 배치 할 수 있으며 그럼에도 CI가 작동합니다. 비즈니스 로직, 데이터 조작 및 데이터 표시의 엄격한 분리를 수행하면 향후 귀하의 앱이 훨씬 더 관리하기 쉽습니다. 비록 당신이 당신의 코드를 유지할 수있는 유일한 사람 일지라도, 나는 지금부터 6 개월 후, 당신이 질의를 포함하는 뷰로 돌아갈 때 "올바른"MVC 방식을 수행하지 않았다고 스스로 저주 할 것입니다.

+0

감사! 그런 다음 결과가 표시되지 않을 때 다른보기를 만들어야합니까? 그런 식으로 모든 논리가 내 컨트롤러에있게됩니까? –

+0

글쎄, 안돼, 당신의 전망이 좋아 보인다; 코드를 업데이트하고 잠시만 기다리십시오 –

+0

도움이되는 답변에 감사드립니다. 해피 코딩! –

0

보기에서 쿼리를 전달하지 않는 것이 좋습니다. Idle Practice와 MVC 아키텍처의 핵심 개념은 Controller (Logic) - Model (Code Behind/Data 조작) - View (Templates)를 분리하는 것입니다.

배열의 전체 결과 집합을보기로 전달하는 것이 좋습니다. 희귀/특정 사례에서 BUT를보기 위해 쿼리를 전달할 수 있습니다. [예를 들어, 컨트롤러의 각 함수에서 모델 쿼리를 렌더링하고 뷰에 전달할 필요가 없도록 모델 쿼리를보기 위해이 경우 바닥 글에 데이터가 필요합니다.]

엄마는 분명해.

감사합니다.