我试图遍历两个连接的数据表。一个表是图像集,另一个是图像。图像具有收集的外键。
我的问题是,如何在我看来实现以下目标?
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()给出下一个和上一个图像而不是下一个和上一个图像集合。
答案 0 :(得分: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>..
}
但是这最后一个代码意味着循环两次。