使用codeigniter主动查询方法从数据库中选择和计数记录

时间:2014-09-13 08:47:08

标签: mysql codeigniter codeigniter-2

我的数据库中有两个表“tbl_room_info”& “tbl_room_image”。

tbl_room_info结构:

room_id | room_name | room_details

tbl_room_image结构:

room_id | room_image_path

现在我想从我的tbl_room_info表中获取所有房间信息,并从tbl_room_image表中计算我的房间图像编号。例如,考虑tbl_room_info有1条记录,其中room_id为'2',而tbl_room_image也有相同的room_id有5个房间图像。我想在我的视图页面中实现所有信息,如下所示:

房间名称|房间详情|房间图片编号

 1          room details     5

 2          room details     6

我的问题是我可以通过正常的mysql查询得到这个:

     SELECT `tbl_room_info`.*, COUNT('tbl_room_image.*') AS imc FROM (`tbl_room_info`, `tbl_room_image`) WHERE `tbl_room_info`.`room_id` = tbl_room_image.room_id GROUP BY `tbl_room_info`.`room_id`

但我想要这个codeigniter活动记录格式。这是我的查询,它没有正常工作。请帮忙

    $this->db->select('tbl_room_info.*', 'count(tbl_room_image.*) as imc');
    $this->db->from('tbl_room_info, tbl_room_image');
    $this->db->where('tbl_room_info.room_id = tbl_room_image.room_id');
    $this->db->group_by('tbl_room_info.room_id');
    return $this->db->get()->result();

这是我的观点:

    <tbody>
    <?php foreach($roomlists as $roomlist){?>
        <tr>
            <td><?php echo $roomlist->room_type;?></td>
            <td><?php echo $roomlist->room_name;?></td>
            <td><?php echo $roomlist->room_details;?></td>
            <td>Total Pictures <span class="badge"><?php echo $roomlist->imc;?></span></td>
        </tr>
    <?php }?>
    </tbody>

1 个答案:

答案 0 :(得分:2)

使用Active Record的JOIN - $this->db->join(); 。请尝试以下 -

$this->db->select('tbl_room_info.*, count(tbl_room_image.room_image_path) as imc', FALSE);
$this->db->from('tbl_room_info');
$this->db->join('tbl_room_image', 'tbl_room_info.room_id = tbl_room_image.room_id');
$this->db->group_by('tbl_room_info.room_id');
$query = $this->db->get();

echo $this->db->last_query(); exit;  // print resulting query
print_r($query->result()); exit;     // check resulting array

if($query->num_rows() > 0)
    return $query->result();
return false;


编辑(答案解释):

$this->db->select(); 中的第二个参数(可选)实际上是boolean值(应为TRUE / FALSE)。默认情况下,该值为 TRUE TRUE 表示使用 backticks 保护选择内的任何内容。 FALSE 表示相反,即阻止 backticks 保护它。为什么我们这样做,因为我们在选择中添加了 COUNT ,它受到 backticks 的保护,即 {{ 1}} ,这肯定是 COUNT(tbl_room_image.room_image_path) as imc 错误。