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

CodeIgniter中如何通过onchange根据location值生成对应前缀自增ID

CodeIgniter 关联地点动态自增ID实现方案

核心分三层改造,完全满足分前缀独立计数、切换地点实时更新ID的需求:

1. 模型层(Model)改造

原有assign_id方法只查询全表最后一条,改为支持按前缀定向查询,同时新增AJAX请求对应的ID生成逻辑:

// Id_model.php
/**
 * 按前缀查询对应分类下最新ID
 * @param string $prefix ID前缀
 * @return object|null 匹配前缀的最新记录
 */
public function get_last_id_by_prefix($prefix) {
    $this->db->select('id');
    $this->db->like('id', $prefix.'-', 'after'); // 严格匹配前缀开头的ID,避免跨前缀误匹配
    $this->db->order_by('id', 'DESC');
    $this->db->limit(1);
    return $this->db->get('test')->row();
}

/**
 * 响应AJAX请求,返回指定地点对应的可用ID
 */
public function get_available_id() {
    $location = $this->input->post('location');
    // 统一维护地点-前缀映射关系,后续新增地点直接在此数组加配置即可
    $prefix_map = [
        'one' => 'XYZ',
        'two' => 'ABC',
        'three' => 'DEF' // 现有three选项可按需修改对应前缀
    ];

    if(!isset($prefix_map[$location])) {
        echo json_encode(['code' => 400, 'msg' => '请选择有效地点']);
        exit;
    }

    $prefix = $prefix_map[$location];
    $last_record = $this->get_last_id_by_prefix($prefix);
    
    if(empty($last_record)) {
        $new_id = $prefix . '-001';
    } else {
        $last_num = (int)str_replace($prefix.'-', '', $last_record->id);
        $new_num = str_pad($last_num + 1, 3, 0, STR_PAD_LEFT);
        $new_id = $prefix . '-' . $new_num;
    }

    echo json_encode(['code' => 200, 'data' => ['id' => $new_id]]);
    exit;
}

/**
 * 数据入库方法
 */
public function create($data) {
    return $this->db->insert('test', $data);
}

注意:不要把前缀映射散落在控制器、视图层,统一存在模型中维护,后续调整规则只需要改一处。

2. 控制器层(Controller)改造

删除原有写死XYZ前缀的ID生成逻辑,新增AJAX接口入口:

// Test.php 控制器
public function create() {
    $this->load->model('id_model');
    $this->form_validation->set_rules('id','ID','required');
    $this->form_validation->set_rules('location','Location','required');

    if ($this->form_validation->run() == false) {
        // 页面初始加载不生成固定ID,等用户选择地点后动态填充
        $this->load->view('test/create', ['id' => '']);
    } else {
        // 入库逻辑无需调整,前端传入的ID已经匹配对应地点前缀,直接存储即可
        $formArray = array();
        $formArray ['id'] = $this->input->post ('id');
        $formArray ['location'] = $this->input->post ('location');
        $formArray ['created_at'] = date ('d-m-y H:i:s');
        $this->id_model->create($formArray);
        $this->session->set_flashdata('success','Id created successfully!');
        redirect(base_url().'index.php/test/index');
    }    
}

// 新增AJAX接口,供前端下拉切换时调用
public function get_id() {
    $this->load->model('id_model');
    $this->id_model->get_available_id();
}

记得确认路由配置,保证/index.php/test/get_id路径可正常接收POST请求。

3. 视图层(View)改造

给地点下拉框绑定切换事件,选中值后异步拉取对应前缀的最新ID填充到输入框:

<div class="row table-1">
    <div class="col-md-6">
        <label class="form-label" for="location">Location</label>
        <select class="form-control" name="location" id="location" style="height: 60%;">
            <option value="">--Select location--</option>
            <option value="one">One</option>
            <option value="two">Two</option>
            <option value="three">Three</option>
        </select>
    </div>
    <div class="col-md-6">
        <label class="form-label" for="id">ID</label>
        <input class="form-control" type="text" name="id" id="id" value="<?php echo $id?>" readonly placeholder="请先选择地点">
    </div>
</div>

<!-- 绑定切换事件,项目已引入jQuery可直接添加以下代码 -->
<script>
$(function() {
    $('#location').on('change', function() {
        let locationVal = $(this).val();
        let idInput = $('#id');
        if(!locationVal) {
            idInput.val('');
            return;
        }
        $.post('<?php echo base_url("index.php/test/get_id");?>', {location: locationVal}, function(res) {
            if(res.code == 200) {
                idInput.val(res.data.id);
            } else {
                alert(res.msg);
                idInput.val('');
            }
        }, 'json').fail(function() {
            alert('ID获取失败,请刷新重试');
        })
    })
})
</script>

逻辑合规性说明

  • 不同前缀计数完全独立:比如XYZ前缀已经生成到XYZ-005,切换到ABC前缀时会从ABC-001开始计数,互不干扰
  • 不会出现无效跳号:只有数据真正入库后,对应前缀的序号才会递增,用户选了地点但未提交的场景下,重新选择该地点拿到的仍是同一个可用ID
  • 扩展性强:后续新增地点选项,只需要在视图select中加option、在模型的$prefix_map中加对应前缀映射即可,不需要调整核心逻辑

内容的提问来源于stack exchange,提问作者Renuga G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:33:17