You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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;
    }
}

代码说明:

  1. 去掉了distinct('A.cod_disob_id'),因为我们需要获取所有处罚记录来合并;
  2. 查询结果转成数组后,通过循环把同一个cod_disob_id的记录合并,把处罚数据放到punishments子数组里;
  3. 最后返回的结构是每个违规条目对应一个数组,里面包含违规标题和该条目下的所有处罚列表,这样前端就能轻松把处罚内容展示在对应违规条目下(比如id=5的条目里)。

如果你更希望在数据库层面用字符串合并(比如把处罚内容用逗号分隔),也可以用MySQL的GROUP_CONCAT函数,不过这种方式适合简单的文本展示,不如数组灵活。如果需要这种方案可以告诉我哦~

内容的提问来源于stack exchange,提问作者Khazlie Nemuel Lim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:16:57