0

結合された 2 つのデータ テーブルをループしようとしています。1 つのテーブルは画像コレクションで、もう 1 つは画像です。画像には、コレクションへの外部キーがあります。

私の質問は、私の見解では次のことをどのように達成するのですか?

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 つ (コレクション) と複数 (写真) であるため、結合クエリではできません。

解決策 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();

あなたの見解では

上記の 2 つのソリューションは、このコードで機能します。

//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>..

}

しかし、この最後のコードは、2 回ループすることを意味します。

于 2013-05-05T13:05:39.657 に答える