利用 MySQL 自增列生成订单号

在 MySQL 里创建一个带有自增列的表,使用 MEMORY ENGINE 存储即可。
利用时间生成字符串,后面再加上自增列生成的数字,根据业务容量仅取最后几位,示例代码仅取后4位。

<?php
namespace app\api\service;

/**
 * CREATE TABLE IF NOT EXISTS `order_id_seq` (
 *     id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
 *     PRIMARY KEY (`id`)
 * ) ENGINE=MEMORY AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
 */
class OrderIdService {

    /**
     * Returns next order ID.
     *
     * @return string
     */
    public function nextId() {
        $seq = $this->nextSeq();
        $id = date('YmdHis') . sprintf('%04d', $seq % 10000);
        return $id;
    }

    /**
     * Returns next sequence number.
     *
     * @return number
     */
    private function nextSeq() {
        $db = \think\Db::connect('db_platform');
        $seq = $db->table('order_id_seq')->insertGetId(['id' => 0]);
        $db->table('order_id_seq')->where('id', $seq)->delete();
        return $seq;
    }

}