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
相关产品推荐
相关产品推荐

