Для начала это действительно не специфично для CodeIgniter. У меня возникли проблемы с пониманием идеи, поэтому любой, кто знает PHP / SQL (или что бы то ни было, моя проблема), может перепрыгнуть.
У меня есть 2 стола, «Фото» и «Альбом».
Album columns : ID TITLE USER_ID CREATED MODIFIED Photo columns : ID ALBUM_ID TITLE LOC CREATED MODIFIED
Я использую запрос
$this->db->select('*'); $this->db->from('album'); $this->db->join('photo', 'album.id = photo.album_id'); $this->db->limit(10); return $this->db->get();
который, я думаю, переводится в
SELECT * FROM album JOIN photo ON album.id = photo.album_id LIMIT 10;
В любом случае, я не понимаю, как отображать каждый альбом со связанными фотографиями.
Так что-то вроде …
<div class="album"> <img src="image1" /> <img src="image2" /> </div> <div class="album"> <img src="image3" /> </div>
В принципе, как я «эхо» выхожу из правильных альбомов и их относительных изображений? Насколько я могу судить, цикл foreach просто собирается выписать каждое изображение без различия между тем, к какому альбому принадлежит изображение.
Должен ли я использовать JOIN-запрос?
ОБНОВИТЬ:
Вау, ок тилман, ты про. Большое спасибо за помощь. Для других, ссылающихся на это, убедитесь, что вы изменили «id» в $ array [$ row ['id']] [] = $ row; независимо от вашего идентификатора альбома. В моем случае его album_id. Мое заключительное заявление о соединении было переписыванием id с помощью album_id.
Да, присоединиться к двум столам – это путь.
$query = $this->db->query(' SELECT * FROM album a JOIN photo p ON a.id = p.album_id LIMIT 10 '); foreach ($query->result_array() as $row) { $array[$row['id']][] = $row; } foreach ($array as $album) { echo '<div class="album">'; foreach ($album as $photo) { echo '<img src="' . $photo['src'] . '"/>'; } echo '</div>'; }
Я взломал этот кусок кода, надеюсь, это сработает для вас. Мы извлекаем все данные из db, помещаем их в многопоточный массив, сгруппированный по альбомам.
Затем переберите этот массив и покажите окончательный html.
Наверное, это не самое красивое решение, но нужно выполнить эту работу;)
Я использую Doctrine с Codeigniter, который предоставляет эту функциональность из коробки, она называется гидратором массива. Можете взглянуть на него.
Дайте мне знать, если вам нужна помощь в настройке.