Laravel Seeder使用haruncpi/laravel-id-generator解决自定义ID重复问题
问题描述
使用haruncpi/laravel-id-generator包生成自定义ID(kd_artis),执行批量插入两条数据时程序正常运行,但生成的ID出现重复情况。代码如下:
class ArtisSeeder extends Seeder { public function CustomId() { $config = [ 'table' => 'artis', 'field' => 'kd_artis', 'length' => 4, 'prefix' => 'A' ]; return IdGenerator::generate($config); } public function run() { DB::table('artis')->insert([ [ 'kd_artis' => $this->CustomId(), 'nm_artis' => 'ROBERT DOWNEY', 'jk' => 'PRIA', 'bayaran' => 10000000000, 'award' => 2, 'negara' => 'AS', ], [ 'kd_artis' => $this->CustomId(), 'nm_artis' => 'ANGELINA JOLIE', 'jk' => 'WANITA', 'bayaran' => 700000000, 'award' => 1, 'negara' => 'AS', ], ]); } }
解决办法
重复ID的根源是:批量插入时,两次ID生成操作几乎同时执行,此时第一条数据还未写入数据库,ID生成器读取的是同一组最大值,最终生成重复ID。以下是三种可行的解决方式:
方式一:拆分独立插入
将批量插入改为两次单独的insert操作,确保每次生成ID时,前一条数据已完成入库,ID生成器能获取到最新的最大值:
public function run() { DB::table('artis')->insert([ 'kd_artis' => $this->CustomId(), 'nm_artis' => 'ROBERT DOWNEY', 'jk' => 'PRIA', 'bayaran' => 10000000000, 'award' => 2, 'negara' => 'AS', ]); DB::table('artis')->insert([ 'kd_artis' => $this->CustomId(), 'nm_artis' => 'ANGELINA JOLIE', 'jk' => 'WANITA', 'bayaran' => 700000000, 'award' => 1, 'negara' => 'AS', ]); }
方式二:手动递增ID后缀
若要保留批量插入,可先生成第一个ID,再手动递增后缀数字生成第二个ID(需匹配ID的长度规则):
public function run() { $firstId = $this->CustomId(); // 提取前缀后的数字部分,加1后补零到指定长度(length=4,前缀占1位,数字部分3位) $number = intval(substr($firstId, 1)) + 1; $secondId = 'A' . str_pad($number, 3, '0', STR_PAD_LEFT); DB::table('artis')->insert([ [ 'kd_artis' => $firstId, 'nm_artis' => 'ROBERT DOWNEY', 'jk' => 'PRIA', 'bayaran' => 10000000000, 'award' => 2, 'negara' => 'AS', ], [ 'kd_artis' => $secondId, 'nm_artis' => 'ANGELINA JOLIE', 'jk' => 'WANITA', 'bayaran' => 700000000, 'award' => 1, 'negara' => 'AS', ], ]); }
方式三:事务内强制刷新最大值
用数据库事务包裹操作,生成第一个ID后手动查询最新最大值,确保第二个ID基于最新数据生成:
public function run() { DB::transaction(function () { $firstId = $this->CustomId(); // 手动查询当前最新ID,确保生成第二个ID时用最新值 DB::table('artis')->max('kd_artis'); $secondId = IdGenerator::generate([ 'table' => 'artis', 'field' => 'kd_artis', 'length' => 4, 'prefix' => 'A', 'reset_on_prefix_change' => true ]); DB::table('artis')->insert([ [ 'kd_artis' => $firstId, 'nm_artis' => 'ROBERT DOWNEY', 'jk' => 'PRIA', 'bayaran' => 10000000000, 'award' => 2, 'negara' => 'AS', ], [ 'kd_artis' => $secondId, 'nm_artis' => 'ANGELINA JOLIE', 'jk' => 'WANITA', 'bayaran' => 700000000, 'award' => 1, 'negara' => 'AS', ], ]); }); }
内容的提问来源于stack exchange,提问作者Muhammad Hakim
相关产品推荐
相关产品推荐

