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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:25:03