18 位無重複訂單號生成程式碼

Jouzeyu發表於2019-12-19

這個系列相當於一些小的“工具”,拿來即用,為便捷存在。

思路說明

監聽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 協議》,轉載必須註明作者和本文連結
空舟湖上~      ——Jouzeyu

相關文章