如何使用CodeIgniter+jQuery Ajax对关联表进行分组?
调整代码实现关联内容合并到对应条目下
嘿,我来帮你修改这段模型层代码,实现把同一个cod_disob_id(比如你提到的id=5)下的关联处罚内容合并到单个条目里。
先说明下你的需求对应场景:
你提供的第一张图是用于展示输出结果的index页面代码,第二张图展示了期望效果——将同一个违规条目(相同
cod_disob_id)下的多条处罚记录整合在一起,而不是返回多条重复的违规标题记录。
修正后的代码方案
当前你的查询因为左联了cod_disob_punish表,每一条处罚记录都会返回一条结果,导致同一个cod_disob_id出现多条重复的违规标题。我们可以先查询出所有数据,再在PHP里把相同cod_disob_id的处罚数据合并成数组:
public function showallcoddislist(){ $company_id = $this->input->get('company_id'); $location_id = $this->input->get('location_id'); $cod_id = $this->input->get('id'); $this->db->select('A.cod_disob_id,A.disob_title,B.disob,B.punish,B.num_days,B.offense,B.pun_id'); $this->db->order_by('A.cod_disob_id', 'asc'); $this->db->where(array( 'A.company_id' => $company_id, 'A.location_id' => $location_id, 'A.cod_id' => $cod_id )); $this->db->join("cod_disob_punish B","B.cod_disob_id = A.cod_disob_id","left outer"); $query = $this->db->get('cod_disobedience A'); if($query->num_rows() > 0){ $result = $query->result_array(); $merged_data = array(); // 遍历结果,合并相同cod_disob_id的处罚数据 foreach($result as $row){ $disob_id = $row['cod_disob_id']; // 如果该违规ID还没在合并数组里,先初始化基础信息 if(!isset($merged_data[$disob_id])){ $merged_data[$disob_id] = array( 'cod_disob_id' => $row['cod_disob_id'], 'disob_title' => $row['disob_title'], 'punishments' => array() // 用于存储该违规下的所有处罚 ); } // 如果有处罚数据(排除左联可能出现的空记录),添加到punishments数组 if(!empty($row['pun_id'])){ $merged_data[$disob_id]['punishments'][] = array( 'disob' => $row['disob'], 'punish' => $row['punish'], 'num_days' => $row['num_days'], 'offense' => $row['offense'], 'pun_id' => $row['pun_id'] ); } } // 把关联数组转成索引数组返回,方便前端遍历 return array_values($merged_data); }else{ return false; } }
代码说明:
- 去掉了
distinct('A.cod_disob_id'),因为我们需要获取所有处罚记录来合并; - 查询结果转成数组后,通过循环把同一个
cod_disob_id的记录合并,把处罚数据放到punishments子数组里; - 最后返回的结构是每个违规条目对应一个数组,里面包含违规标题和该条目下的所有处罚列表,这样前端就能轻松把处罚内容展示在对应违规条目下(比如id=5的条目里)。
如果你更希望在数据库层面用字符串合并(比如把处罚内容用逗号分隔),也可以用MySQL的GROUP_CONCAT函数,不过这种方式适合简单的文本展示,不如数组灵活。如果需要这种方案可以告诉我哦~
内容的提问来源于stack exchange,提问作者Khazlie Nemuel Lim
相关产品推荐
相关产品推荐

