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

Laravel中为各实体ID添加10位唯一数字ID的最优实现方案

解决方案:生成10位不重复数字的unique_id字段

问题分析

你之前使用uniqid()未达预期的原因:

  • uniqid()生成的是含字母的字符串,不符合纯数字要求
  • 无法保证严格的10位长度
  • 高并发场景下存在重复风险

最优实现方案

1. 数据库层约束

先给orders表添加unique_id字段,确保唯一性与长度:

ALTER TABLE orders ADD COLUMN unique_id CHAR(10) NOT NULL UNIQUE;

(如果用Laravel迁移,可编写对应迁移文件完成字段添加)

2. 模型层生成逻辑

修改App\Models\Order.php的creating回调,生成符合要求的10位不重复数字:

protected static function booted()
{
    static::creating(function ($order) {
        do {
            // 生成10位随机数字,范围覆盖1000000000到9999999999
            $uniqueId = mt_rand(1000000000, 9999999999);
            // 检查该数字是否已存在
            $exists = static::where('unique_id', $uniqueId)->exists();
        } while ($exists);
        
        $order->unique_id = $uniqueId;
    });
}

优化建议

  • 高并发场景优化:可预先生成一批10位数字存入缓存(如Redis),创建订单时直接从缓存取值,减少数据库查询次数
  • 降低重复概率:可结合时间戳+随机数生成,比如取当前时间戳后6位加4位随机数,进一步降低冲突可能
  • API路由适配:后续API操作改用unique_id作为标识符,例如更新订单的请求改为PATCH http://127.0.0.1:8000/api/v1/orders/{unique_id},同时在模型中设置路由绑定字段:
    public function getRouteKeyName()
    {
        return 'unique_id';
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:45:55