2012-03-09 111 views
1

所以我试图循环所有通过id连接的表的值。有4个表参与,我试图根据第一个表的ID从每个表中获取所有值。这是我迄今为止的代码。 (PS我使用CodeIgniter的数据库的方法)将多个表值放入数组

$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 
             );     
       } 
      } 
     } 
    } 

我一直在摆弄周围了一段时间,所以有可能是未在最佳时尚:)

这样做基本的某些行我以后需要遍历数组,但我只是不确定实际填充它的最佳方法。

感谢您的帮助!

回答

1

在我看来,你的代码正在做一些替换,你可能不希望它。至少与线:

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

如果您有兴趣使用(呈现)的实体(表)分开的数据,那么我劝你做出的唯一改变是改变那些两条线(上图)以下:

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

,但我注意到,您包括每个儿童实体的父ID这使我得出结论,要使用/的方式来呈现这些数据以反映关系的层次结构。如果是这样,我建议你做类似的情况:

$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 2012-03-10 10:39:52

+0

很高兴你喜欢它。您可以使用嵌套循环以类似于构建结果的方式迭代结果数据。 – ghbarratt 2012-03-10 15:06:43

+0

我最近对我的回答感到担心的是,您可能只想在自己的演示文稿中呈现不同的数据实体(表格)(例如列出与主题分开的徽章)。如果是这样的话,那么它实际上会更有意义为每个数组构建单独的数组,但是当我看到您在每个数据库中都包含父ID时,我认为您有兴趣保留这些关系,所以我决定构建数组来处理它。我正在做一个小小的编辑来记录这一点。 – ghbarratt 2012-03-10 15:23:35