Laravel 8中IdGenerator组件异常‘table field type is bigint but prefix is string’的排查解决及双点格式ID生成方案
解决Laravel 8中使用LaravelIdGenerator生成会员编号的两个问题
我来帮你搞定这两个头疼的问题,其实都是参数配置没到位导致的,咱们逐个解决:
问题1:字段类型不匹配异常
原因分析
Haruncpi\LaravelIdGenerator默认会检查**主键字段(id)**的类型,而你的表中id是bigint类型,但你给的前缀是字符串,所以它抛出了类型不匹配的异常——它误以为你要给id字段生成带前缀的编号,但实际上你要操作的是no_anggota字段。
解决方案
在IdGenerator::generate()的参数数组里添加'field' => 'no_anggota',明确指定要生成编号的目标字段,这样它就会检查no_anggota的string类型,不会再报错了。
问题2:无法生成带两个点的编号格式
原因分析
你之前设置的length参数不对:目标格式190772.2021.00000001的总长度是20(6位日日月月年年 + 1个点 + 4位年份 + 1个点 + 8位序号 = 6+1+4+1+8=20),之前设置的19长度不够,导致包自动截断了部分字符,把点给合并掉了。
解决方案
- 把
length参数从19改成20; - 前缀拼接可以调整得更清晰(虽然原写法逻辑没问题,但这样可读性更强):直接用
date('dmy', strtotime($tgl)) . '.' . date('Y', strtotime($tgl)) . '.'生成带两个点的前缀。
修改后的AnggotaFactory代码
namespace Database\Factories; use App\Models\Anggota; use Illuminate\Database\Eloquent\Factories\Factory; use App\Models\User; use Haruncpi\LaravelIdGenerator\IdGenerator; class AnggotaFactory extends Factory { /** * The name of the factory's corresponding model. * * @var string */ protected $model = Anggota::class; /** * Define the model's default state. * * @return array */ public function definition() { $tgl = $this->faker->date; // 生成带双点的前缀:例如190772.2021. $prefix = date('dmy', strtotime($tgl)) . '.' . date('Y', strtotime($tgl)) . '.'; return [ 'id_user' => User::factory(), 'no_anggota' => IdGenerator::generate([ 'table' => 'anggotas', 'field' => 'no_anggota', // 新增:指定目标字段 'length' => 20, // 修改为正确的总长度 'prefix' => $prefix ]), 'nama_lengkap' => $this->faker->name, 'tempat_lahir' => $this->faker->cityPrefix, 'tanggal_lahir' => $tgl, 'nama_instansi' => $this->faker->word, ]; } }
这样修改之后,就能正常生成190772.2021.00000001格式的会员编号,也不会再抛出字段类型异常了。
内容的提问来源于stack exchange,提问作者Ismynr
相关产品推荐
相关产品推荐

