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

用户提交表单时生成LP前缀自增refno编号的实现方案问询

你要的逻辑可以直接在insert_listing方法里实现,同时通过数据库事务保证原子性,避免并发提交出现编号重复的问题,具体修改如下:

修改模型类insert_listing方法

function insert_listing($maindata){
    // 开启事务,保证查询+插入的原子性,避免并发重复
    $this->db->trans_start();
    
    // 查询最新的最大refno,加行锁避免并发查询拿到相同值
    $this->db->select('refno');
    $this->db->from('crm_listings');
    $this->db->order_by('refno', 'DESC');
    $this->db->limit(1);
    $this->db->lock_for_update(); // 加写锁,其他事务要等当前事务提交才能查询
    $query = $this->db->get();
    
    $new_num = 1;
    if($query->num_rows() > 0){
        $last_ref = $query->row()->refno;
        // 去掉LP前缀转成数字
        $last_num = intval(str_replace("LP", "", $last_ref));
        $new_num = $last_num + 1;
    }
    
    // 生成新的refno,补5位前导零
    $new_refno = 'LP' . str_pad($new_num, 5, '0', STR_PAD_LEFT);
    // 把refno加到插入数据数组
    $maindata['refno'] = $new_refno;
    
    // 执行插入
    $this->db->insert("crm_listings",$maindata);
    $prime = $this->db->insert_id();
    
    // 提交事务
    $this->db->trans_complete();
    
    if ($this->db->trans_status() === FALSE) {
        return false;
    }
    return $prime;
}

补充说明

  • 上述代码适配CodeIgniter 3及以上版本,用事务+行锁的组合,确保两个用户同时提交时,后到的请求会等前一个请求的事务提交完成后再查询最大refno,不会拿到相同数值生成重复编号。
  • 建议额外给数据库的refno字段加上唯一索引,作为兜底避免极端情况出现重复编号。
  • 控制器代码不需要做任何修改,所有生成逻辑都收敛在模型插入方法内,符合你仅在提交时生成编号的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:36:02