2012-03-09 4 views
1

그래서 나는 ID로 연결하는 테이블의 모든 값을 반복하려고합니다. 4 개의 테이블이 관련되어 있으며 첫 번째 테이블의 ID에 따라 각각의 값을 모두 얻으려고합니다. 지금까지 제가 가지고있는 코드는 다음과 같습니다. 배열에 여러 테이블 값 넣기

$course = $this->db->query("SELECT * FROM courses"); 

    // Put Courses into array 
    foreach ($course->result() as $row) 
    { 
     $courses['id'] = $row->id; 
     $courses['course_name'] = $row->course_name; 

     // Put Topics into array 
     $topic = $this->db->query("SELECT * FROM course_topics WHERE course_id = 5"); 
     foreach ($topic->result() as $row) 
     { 
      $topics[] = array(
           'id'   => $row->id, 
           'course_id'  => $row->course_id, 
           'topic_name' => $row->topic_name, 
           'order'   => $row->order 
           ); 

      // Put badges into array 
      $badge = $this->db->query("SELECT * FROM course_topic_badges WHERE topic_id = ".$row->id); 
      foreach ($badge->result() as $row) 
      { 
       $badges[] = array(
            'id'   => $row->id, 
            'topic_id'  => $row->topic_id, 
            'badge_name' => $row->badge_name 
            ); 

       // Put dotpoints into array 
       $dotpoint = $this->db->query("SELECT * FROM course_topic_dotpoints WHERE badge_id = ".$row->id); 
       foreach ($dotpoint->result() as $row) 
       { 
        $dotpoints[] = array(
             'id'   => $row->id, 
             'badge_id'  => $row->badge_id, 
             'dotpoint'  => $row->dotpoint, 
             'viddler_video_id' => $row->viddler_video_id, 
             'viddler_openurl' => $row->viddler_openurl, 
             'order'   => $row->order 
             );     
       } 
      } 
     } 
    } 

그래서 기본적으로 최고의 패션 :

에서 수행되지 않는 일부 라인이 될 수 있도록 내가 잠시 동안 하구 봤는데 (PS 나는 CodeIgniter의 데이터베이스 방법을 사용하고 있습니다) 나중에 배열을 반복 할 필요가 있지만 실제로 채우기위한 가장 좋은 방법은 확실하지 않습니다.

도움을 주셔서 감사합니다.

답변

1

당신의 코드가 당신이 원하지 않는 대체 코드를하고있는 것처럼 보입니다. 라인에 적어도 : 다음 엔티티 (테이블)로 구분 된 데이터를 사용하여 (제시)에 관심이 있다면

$courses['id'] = $row->id; 
$courses['course_name'] = $row->course_name; 

난 당신이 할 조언 만 변경 다음에 그 두 줄 (위) 변경입니다 : 당신은 당신이 사용/관계형 계층 구조를 반영하는 방식으로 데이터를 표시 할 것인지 결론을 날 리드 아이들 엔티티의 각 부모 ID를 포함하는 것으로 나타났습니다

$courses[] = array('id'=>$row->id, 'course_name'=>$row->course_name); 

하지만. 그것은 당신이 같은 일을하는 것이 좋습니다 경우 경우 :

$query = $this->db->query('SELECT * FROM courses'); 
$courses = $query->result_array(); 

// Put Courses into array 
foreach ($courses as &$c) 
{ 
    // Put Topics into array 
    $query = $this->db->query('SELECT id, topic_name, `order` FROM course_topics WHERE course_id = '.$c['id']); 
    $topics = $query->result_array(); 
    $c['topics'] = $topics; 
    foreach ($topics as $ti=>$t) 
    { 
    $query = $this->db->query('SELECT id, badge_name FROM course_topic_badges WHERE topic_id = '.$t['id']); 
    $badges = $query->result_array(); 
    $c['topics'][$ti]['badges'] = $badges; 
    foreach ($badges as $bi=>$b) 
    { 
     $query = $this->db->query('SELECT id, dotpoint, viddler_video_id, viddler_openurl, `order` FROM course_topic_dotpoints WHERE badge_id = '.$b['id']); 
     $dotpoints = $query->result_array(); 
     $c['topics'][$ti]['badges'][$bi]['dotpoints'] = $dotpoints; 
    } 
    } 
} 

이것은 오히려 큰 연관 배열을 구축,하지만 당신은 정말 모든 데이터를 필요로하기 위하여려고하고 관계형 계층 구조가 중요한 경우 좋은 데이터 구조입니다 너에게. 확실히 당신이 사용하는 것만을 사용하여 빌드하는 것을 줄이는 것이 가장 좋습니다.

편집 :

이것은 당신이/반복 배열에서 정보를 추출하는 방법이다. 이 코드는 뷰 파일에 있습니다.

<h2>Courses:</h2> 
<?php 
    foreach($courses as $c) 
    { 
    echo '<h3>'.$c['course_name'].' ('.$c['id'].")</h3>\n"; 
    echo '<ul>'; 
    foreach($c['topics'] as $t) 
    { 
     echo '<li>'.$t['topic_name'].' ('.$t['id'].")</li>\n"; 
     echo '<ul>'; 
     foreach($t['badges'] as $b) 
     { 
     echo '<li>'.$b['badge_name'].' ('.$b['id'].")</li>\n"; 
     echo '<ul>'; 
     foreach($b['dotpoints'] as $dp) 
     { 
      echo '<li>'.$dp['dotpoint'].' viddler: '.$dp['viddler_video_id'].' viddler_url: '.$dp['viddler_openurl']."</li><br/>"; 
     } 
     echo '</ul>'; 
     }  
     echo '</ul>'; 
    } 
    echo '</ul>'; 

    } 
?> 
+0

놀라워요! 그것은 매우 도움이되고, 일을하는 훨씬 더 좋은 방법을 보여줍니다. 이 배열을 반복하는 가장 좋은 방법은 무엇입니까? – Sneaksta

+0

다행이었습니다. 중첩 루프를 사용하여 결과 데이터를 사용자가 작성한 방식과 유사한 방식으로 반복 할 수 있습니다. – ghbarratt

+0

나의 답변에 대한 최근 관심사는 주제와는 별도로 배지를 나열하는 등 자신의 프레젠테이션에 다른 데이터 엔티티 (표)를 제시하고자 할 수 있다는 것입니다. 그렇다면 사실 각각의 배열을 개별적으로 구축하는 것이 더 합리적입니다.하지만 부모님의 ID를 포함하는 것을 보았을 때 관계를 유지하는 데 관심이 있다고 생각해서 결정했습니다. 그것을 처리 할 배열을 만들 수 있습니다. 나는 이것을 기록하기 위해 작은 편집을하고있다. – ghbarratt