這個系列相當於一些小的“工具”,拿來即用,為便捷存在。
思路說明
監聽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 協議》,轉載必須註明作者和本文連結