Laravel使用Custom ID包生成ID报Undefined array key 0且重复如何解决
问题解决指南
报错原因说明
Undefined array key 0报错:你未指定field参数时,该包默认使用表的id字段作为自增序列计算基准,当表无数据或者id字段不符合数值自增规则时,包查询基准值返回空结果,读取数组下标0就会触发该报错。- 生成ID重复:你指定
field为name字段,该字段为字符串类型,包无法基于字符串读取到递增的数值基准,每次生成都会从初始值开始计算,自然会出现重复。
正确实现方案
你需要生成年月前缀+两位自增后缀的6位编码,按以下步骤修改即可:
步骤1:调整数据库字段
首先修改barcodeID字段类型,避免前导0丢失,同时加唯一约束从底层避免重复:
// 原有字段定义替换为以下内容 $table->string('barcodeID', 6)->nullable()->unique();
步骤2:修改ID生成配置
将生成规则的field参数指定为barcodeID,以该字段的最大值作为自增基准:
public static function boot() { parent::boot(); self::creating(function (Product $model) { $model->barcodeID = IdGenerator::generate([ 'table' => 'products', 'field' => 'barcodeID', 'length' => 6, 'prefix' => date('my') ]); }); }
补充说明
- 该配置下,生成的编码会自动匹配你要的格式:比如2024年8月生成的第一个编码为
082401,第二个为082402,跨月后前缀自动更新,自增后缀从1重新开始计算。 - 若有高并发写入场景,建议将ID生成逻辑包裹在数据库事务中,或加锁避免并发导致的重复生成问题。
内容的提问来源于stack exchange,提问作者Bebo
相关产品推荐
相关产品推荐

