18 位无重复订单号生成代码
这个系列相当于一些小的 “工具”,拿来即用,为便捷存在。
思路说明#
监听 order 模型创建事件,在写入数据库之前进行判断,订单号为空时生成 18 位有效数字编码。订单号的生成规则是 8(年月日)+ 6(随机数)+ 4(时间戳后四位)
protected static function boot()
{
parent::boot();
// 监听模型创建事件,在写入数据库之前触发
static::creating(function ($model) {
// 判断订单号字段no是否为空,为空的话调用订单号生成方法
if (!$model->no) {
$model->no = static::findAvailableNo();
// 如果生成失败,就返回false
if (!$model->no) {
return false;
}
}
});
}
public static function findAvailableNo()
{
$prefix = date('Ymd');
for ($i = 0; $i < 18; $i++) {
// 随机生成 6 位的数字,并创建订单号
$no = $prefix.random_int(100000, 999999).substr(microtime(true),-4);
// 判断是否已经存在
if (!static::query()->where('no', $no)->exists()) {
return $no;
}
}
//写入日志
\Log::warning('find order no failed');
return false;
}
个人理解#
这个是在实战教程 L05 的基础上改的。将原来的 20 位改成了 18 位,弃用了时分秒,在后一部分使用了毫秒级时间戳的后四位,稍微测试了一下,在我本地环境生成 10000 条不重复的订单号耗时 10s。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: