CodeIgniter双表关联查询与关联数据页面展示实现问题
CodeIgniter 关联
tickets_reply表的实操修改方案 之前你写join没出效果,核心是踩了两个常见坑
- 直接写join时没有给重名字段加表前缀:两张表都有
id字段,不指定表名的话查询结果会被reply表的id覆盖,取到的值完全不对 - 没考虑一对多的表关系:一个工单可能对应多条回复,直接join会让主单信息跟着回复条数重复,不符合页面主信息只展示一次、回复单独列块的逻辑
第一步:修改模型层查询逻辑
推荐用更适配展示需求的写法,不用处理重复数据,代码更简洁:
function getalldata($id) { // 先查tickets主表的单条工单数据 $this->db->where('id', $id); $ticket_main = $this->db->get('tickets')->row(); // 单独匹配查询该工单下的所有回复记录 $this->db->where('tickets_id', $id); $ticket_replies = $this->db->get('tickets_reply')->result(); // 把回复数据挂载到主单结果上返回给控制器 $ticket_main->reply_list = $ticket_replies; return $ticket_main; }
如果你已经在练习join()方法,一定要注意给所有字段加表名前缀避免冲突,写法如下:
function getalldata($id) { // 明确指定查询的字段,同名字段加表前缀区分 $this->db->select('tickets.*, tickets_reply.id as reply_id, tickets_reply.remarks, tickets_reply.comment'); // 用左关联,哪怕工单没有回复也能正常展示主单信息 $this->db->join('tickets_reply', 'tickets_reply.tickets_id = tickets.id', 'left'); $this->db->where('tickets.id', $id); $query = $this->db->get('tickets'); $all_rows = $query->result(); if (empty($all_rows)) return false; // 取第一条的主单信息即可,避免重复 $ticket_main = $all_rows[0]; $reply_list = []; // 循环提取所有有效回复 foreach ($all_rows as $row) { if (!empty($row->remarks) || !empty($row->comment)) { $reply_list[] = (object)[ 'reply_id' => $row->reply_id, 'remarks' => $row->remarks, 'comment' => $row->comment ]; } } $ticket_main->reply_list = $reply_list; return $ticket_main; }
注:控制器层代码不需要做任何修改,保持原来的传参、加载模型、分配数据到视图的逻辑即可
第二步:调整视图层展示关联数据
你原来写的主单展示代码完全保留,只需要在现有div块后面追加回复列表的展示逻辑:
<!-- 原有主单展示代码 --> <div class="col-sm-4 invoice-col"> <b>Ticket ID:</b> <?php echo $results->id; ?><br> <b>Business Name:</b> <?php echo $results->bus_name; ?><br> <b>Full Address:</b> <?php echo $results->address; ?><br> <b>Owner Name:</b> <?php echo $results->owner_name; ?><br> <b>Phone Number:</b> <?php echo $results->owner_number; ?><br> </div> <!-- 新增关联回复展示块 --> <div class="col-sm-12" style="margin-top: 24px;"> <h4>关联回复记录</h4> <?php if (!empty($results->reply_list)): ?> <?php foreach ($results->reply_list as $reply): ?> <div style="padding: 12px; border: 1px solid #e5e5e5; margin: 10px 0; border-radius: 4px;"> <p><b>备注:</b><?php echo $reply->remarks; ?></p> <p><b>内容:</b><?php echo $reply->comment; ?></p> </div> <?php endforeach; ?> <?php else: ?> <p>暂无与该工单关联的回复记录</p> <?php endif; ?> </div>
额外提醒
你原视图里引用的pt_person、pt_person_number字段,在贴出的tickets表结构中不存在,如果页面报未定义属性的错误,确认下是漏写了表字段,还是需要从其他关联表补取对应数据就行。
内容的提问来源于stack exchange,提问作者J HON
相关产品推荐
相关产品推荐

