2012-03-09 3 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; 

私はあなたが作ることをお勧めのみ変更以下に、これらの2行を(上記)に変更され:

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

これはかなり大規模な連想配列を作成しますが、あなたが本当にすべてのデータを必要としている場合、それは良いデータ構造であり、リレーショナル階層は重要ですあなたへ。確かに、あなたが使用するものだけにビルドするものを減らすことが最善です。

EDIT:

これは、あなたが/反復配列から情報を抽出する方法をです。このコードはビューファイルにあります。

<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

関連する問題