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

Laravel中如何实现按选中分类生成自定义递增编号

解决方案

你的核心问题是没按分类过滤查询,且编号递增逻辑有误,以下是针对性的修改方案:

关键调整点

  • 新增分类参数,用来区分RED/BLUE两类
  • 按「分类+年份」过滤数据库记录,保证不同分类的编号各自独立递增
  • 直接获取当前分类的最大编号,替代原代码循环遍历的低效操作

修改后的代码

// 从请求或业务逻辑中获取选中的分类,比如前端传的category字段
$category = request('category'); // 实际值为RED或BLUE
$currentYear = date('Y');

// 查询当前分类+年度下的最后一条编号,提取数字部分
$lastRecord = Table::where('code_number', 'LIKE', "%/{$category}/{$currentYear}")
    ->select(DB::raw('LEFT(code_number, 5) as conum'))
    ->orderBy('conum', 'desc')
    ->first();

if ($lastRecord) {
    // 提取数字并递增,格式化为5位补零的字符串
    $nextNumber = (int)$lastRecord->conum + 1;
    $number = sprintf("%05d", $nextNumber);
} else {
    // 该分类本年度无记录,从00001开始
    $number = "00001";
}

// 拼接最终编号
$codenumber = "{$number}/{$category}/{$currentYear}";
return $codenumber;

补充说明

  1. 分类参数传递:确保你能正确拿到用户选中的分类值(比如表单提交的category),替换代码中的$category变量
  2. 年份重置:代码已经通过$currentYear做了过滤,满足每年编号从头开始递增的需求
  3. 格式修正:示例里是5位数字(00001),所以用%05d格式化,原代码的%04s是4位,需要调整
  4. 性能优化:用orderBy('conum', 'desc')->first()直接取最大编号,比循环所有记录高效很多

额外提示

如果要避免并发场景下的编号重复问题,可以:

  • 用数据库事务包裹查询和插入操作
  • 给code_number字段添加唯一索引,强制编号不重复

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:00:02