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

Laravel迁移中如何生成字符串+数字混合的自增ID?

Laravel实现自定义混合格式主键ID(如AA001、AA002)

要替换Laravel默认的自增数字ID,实现字符串+数字的自动递增格式ID,可按以下步骤操作:

1. 修改数据库迁移文件

移除默认的自增ID定义,手动创建字符串类型的主键字段:

public function up()
{
    Schema::create('your_table_name', function (Blueprint $table) {
        // 替换默认的$table->id(),定义字符串主键,长度按需设置(比如AA001是5位)
        $table->string('id', 5)->primary();
        // 添加你的其他业务字段
        $table->string('name');
        $table->timestamps();
    });
}

2. 在模型中实现自动生成ID逻辑

通过模型的creating事件,在数据插入前自动生成符合格式的ID:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class YourModel extends Model
{
    // 关闭默认自增特性
    public $incrementing = false;
    // 指定主键类型为字符串
    protected $keyType = 'string';

    protected static function booted()
    {
        static::creating(function ($model) {
            // 定义ID前缀
            $prefix = 'AA';
            // 查询表中当前最大的ID
            $lastId = static::max('id');
            
            if ($lastId) {
                // 提取ID中的数字部分,转整数后加1
                $number = (int)substr($lastId, strlen($prefix)) + 1;
            } else {
                // 表中无数据时,从1开始
                $number = 1;
            }
            
            // 拼接前缀,将数字补零到指定长度(这里是3位)
            $model->id = $prefix . str_pad($number, 3, '0', STR_PAD_LEFT);
        });
    }
}

3. 注意事项

  • 按需调整前缀和数字补零长度:比如要生成AB0001格式,只需修改$prefix = 'AB',补零长度设为4即可。
  • 高并发场景优化:如果系统并发量较高,为避免重复ID,可在查询最大ID时加行锁:
    $lastId = static::lockForUpdate()->max('id');
    
  • 已有数据的表:如果是对已存在的表修改,需先手动处理现有数据的ID,再执行迁移修改字段类型,最后添加模型逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:22:09