CodeIgniter:在视图中显示两个表的数据 - 使用一个循环?

时间:2013-12-20 09:04:46

标签: php mysql codeigniter codeigniter-2 fetch

我想请一些帮助。 我有这两个数据库表,关系1-n(一个专辑有很多图像):

  albums            images
----------       -------------
album_id            img_id
title               album_id
description         img_file

现在我要做的是在我的视图中显示所有带有图片的相册,如this,请参阅第二个屏幕截图(投资组合)。

这就是我在控制器中的内容:

// fetch all album data 
$albums = $this->album_model->get();

// fetch images for each album
foreach ($albums as $album ) {
 $images = $this->albumimage_model->get_by('album_id', $album->album_id);
}

$data = array(
 'albums'  =>  $albums, 
 'images'  =>  $images, 
);
$this->load->view('album_listing', $data); 

如果我在我的视图中循环播放专辑数据,我会得到:

<?php foreach($albums as $album): ?>
<div class="album">
<p><?php echo $album->title; ?></p>
<p><?php echo $album->description; ?></p>
<div>
<?php endforeach; ?> 

到目前为止一直很好,但现在头疼了: 我想显示属于每张专辑的图片,所以基本上是这样的:

<?php foreach($albums as $album): ?>
<div class="album">
    <p><?php echo $album->title; ?></p>
    <p><?php echo $album->description; ?></p>

    // show all images of the album
    <div class="images"><img src="uploads/<php? echo $album->title;  ?>.'/'.<php? echo $image->image_file;  ?> " /></div>

<div>
<?php endforeach; ?>

根据CodeIgniter的做法,我怎样才能做到这一点?

其他一些信息: 1.我还启用了CodeIgntier的Profiler,我注意到正在运行的查询会像这样递增。如果我有很多专辑(50 - 100张带图片的专辑),这不会增加记忆吗?

  1. 我还尝试使用JOIN只使用一个查询,这样:

    $ albums = $ this-&gt; db-&gt; select('albums。*')    - &gt;选择('images.img_id,images.img_file')    - &gt; join('images','images.album_id = albums.album_id')    - &GT; ORDER_BY( 'albums.album_id')    - &GT;获得( '相册')    - &GT; result_array();

  2. 问题在于我循环访问数据(假设我的数据库中有两个专辑),我在页面上获取了两次数据,如:

    album1 - images of album 1
    album1 - images of album 1
    album2 - images of album 2
    album2 - images of album 2
    

3 个答案:

答案 0 :(得分:1)

$query = $this->db->get('albums');
$albums = $query->result_array();

$query = $this->db->get('images');
$images =$query->result_array();

foreach ($albums as $album)
{

    foreach ($images as $image)
    { 
        if($image['album_id'] == $album['album_id']){
            $data[$album['album_id']]['images'] = $image['album_id'];
        }
    }
}

var_dump($data);

答案 1 :(得分:0)

如果您想要删除重复的条目,请尝试在查询中使用SELECT DISTINCT,这可用于类似目的。 另外,我真的不明白你是什么意思:

  

运行查询会像这样递增

答案 2 :(得分:0)

你可以做以下事情

控制器 -

// fetch all album data <br>
$data['albums']= $this->album_model->get_albums();
// fetch all images<br>
$data['images']=  = $this->album_model->get_images();
$this->load->view('album_listing', $data);<br>

查看(album_listing.php)

foreach ($albums as $album)
{

    foreach ($images as $image)
    { 
        if($image->album_id == $album->album_id)
        echo "Album - ".$album->album_id.", Title".$album->title.", Description".$album->description." Image ID - ".$image->img_id."Img File - ".$image->img_file;
    }
}

备用 在你的模型中

    public function get_images(){
    { 
       $sql ="select a.album_id, a.description, i.img_id, i.img_file from album a, image i where a.album_id = i.album_id"
       $query = $this->db->query($sql);
       $data   =   array();
       foreach ($query->result() as $row) {
        $data[] = $row;
       }
    return $data;
    }

控制器

 $data['albums_img']= $this->album_model->get_images();
 $this->load->view('album_listing', $data);

查看

 foreach ($albums_img as $album)
 { 

    echo "Album - ".$album->album_id.", Title".$album->title.", Description".$album->description." Image ID - ".$album->img_id."Img File - ".$album->img_file;
 }

希望这会对你有所帮助。