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
相关产品推荐
相关产品推荐

