0

我正在尝试遍历两个连接的数据表。一个表是图像集合,另一个是图像。图像具有收集的外键。

我的问题是,我认为如何实现以下目标?

foreach ($collections as $collection) {

    echo '<ul>';

    foreach ($collection->image as $image) {
        echo '<li><img src="'.$image->url.'" /></li>';
    }

    echo '</ul>';

}

我目前在控制器中使用它:

class Collection extends CI_Controller {

    public function index()
    {
        $this->load->model('Collection_model');

        $data['collections'] = $this->Collection_model->get_latest_collections();

        $this->load->view('collection_view.php', $data);    

    }
}

并有以下型号:

class Collection_model extends CI_Model {

    function get_latest_collections()
    {
        $this->db->select('*');
        $this->db->from('photo');
        $this->db->join('collection', 'photo.collection_id = collection.id');
        $this->db->order_by("collection.date_created", "DESC");

        $query = $this->db->get();

        return $query->result();
    }

}

上面的问题是,当我遍历收集结果时,我实际上是直接遍历所有图像。我必须在视图中添加一些逻辑来检查集合 ID 是否已更改为放入 . 这意味着我不能使用 next() 和 prev() 来获取下一个和上一个集合,因为循环正在遍历图像并且 next() 和 prev() 给出下一个和上一个图像而不是下一个和上一个收藏。

4

1 回答 1

0

如果我很好理解您的问题,您希望循环播放您的照片并按收藏集进行组织。

有几种方法可以实现这一点,但这不能通过连接查询来实现,因为表关系是一个(集合)对多个(照片)。

解决方案 1:您想显示所有照片

//get all collections
$collections = $this->db
    ->order_by("date_created", "DESC")
    ->get('collection')
    ->result();

//get all photos
$photos = $this->db
    ->get('photo')
    ->result();

解决方案 2:你想展示一些收藏

//get some collections
$collections = $this->db
    //->where('..', '..') //some filtering
    ->order_by("date_created", "DESC")
    ->get('collection')
    ->result();

//extract ids
$collection_ids = array();

foreach($collections as $collection)
{
    $collection_ids[] = $collection->id;
}

//get photos who are in these collections
$photos = $this->db
    ->where_in('collection_id', $collection_ids)
    ->get('photo')
    ->result();

在你看来

上面的两种解决方案都适用于此代码。

//loop on collections
foreach($collections as $collection)
{
    //<ul>..
    foreach($photos as $photo)
    {
        if($photo->collection_id == $collection->id) 
        {
            //<li>..$photo->url..
        }
    }
    //</ul>..
}

或者在您的第一个代码块中完全符合您的预期

//loop on collections
foreach($collections as $collection)
{
    $collection->images = array();

    foreach($photos as $photo)
    {
        if($photo->collection_id == $collection->id) 
        {
            $collection->images[] = $photo;
        }
    }
}

//so in your view (what you expected)
foreach($collections as $collection)
{
    //<ul>..

    foreach($collections->images as $image)
    {
        //<li>..$image->url..
    }

    //</ul>..

}

但是这最后一个代码意味着循环两次。

于 2013-05-05T13:05:39.657 回答