2013-05-05 3 views
0

Я пытаюсь перебрать две объединенные таблицы данных. Одна таблица - это коллекция изображений, а другая - изображения. Изображения имеют внешний ключ для коллекции.Codeigniter: Query for looping через два результата

Мой вопрос: как мне достичь следующего, на мой взгляд?

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

} 

Проблема с вышесказанным в том, что, когда я Переберите результаты сбора Я фактически перебираю все изображения. Мне нужно поместить некоторую логику в представление, чтобы проверить, изменился ли идентификатор коллекции, чтобы вставить. Это означает, что я не могу использовать next() и prev(), чтобы получить следующую и предыдущую коллекцию, когда цикл перемещается по изображениям, а next() и prev() дает следующее и предыдущее изображение, а не следующее и предыдущее коллекция.

ответ

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(); 

на ваш взгляд

Два решения выше работают с этим c ода.

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

} 

Но этот последний код подразумевает петли дважды.

Смежные вопросы