Laravel - 生成唯一的订单号

时间:2018-03-23 09:31:07

标签: php laravel laravel-5 laravel-4

我目前正在尝试在用户到达create方法时生成唯一的订单号。订单号在种子中生成如下,并且需要看起来像这样

种子

foreach(range(1,25) as $index)
    {
        DB::table('orders')->insert([

            'user_id' => rand(1,25),
            'order_nr' => '#' . sprintf("%08d", $index),
            'price_sum' => $faker->randomNumber($nbDigits = 4, $strict = false) . '.' . $faker->randomNumber($nbDigits = 2, $strict = false),
            'status' => $faker->randomElement(['paid', 'pending', 'failed']),
            'created_at' => Carbon::now(),
            'updated_at' => Carbon::now(),

        ]);
    }

订单号看起来像#00000001#00000002。现在,当用户到达我的控制器中的create方法时,需要创建此序列中的新唯一订单号。我怎样才能做到这一点?控制器目前看起来像这样:

 public function create()
{
    $order = new Order;

    $order->user_id = Auth()->id();
    $order->order_nr = 


    dd($order);


    return view('steps.order');
}

需要检查最新的订单号,并在该订单号上创建一个+1。比如说有25个订单,最后一个是#00000025,下一个需要创建的订单需要#00000026。我怎样才能做到这一点?

6 个答案:

答案 0 :(得分:6)

尝试执行以下操作

$order = new Order;

$order->user_id = Auth()->id();
$latestOrder = App\Order::orderBy('created_at','DESC')->first();
$order->order_nr = '#'.str_pad($latestOrder->id + 1, 8, "0", STR_PAD_LEFT);
$order->save();

这里我假设id是自动递增的。有关详细信息,请参阅str_pad方法

答案 1 :(得分:1)

您可以使用Laravel ID generator

首先安装它: composer require haruncpi/laravel-id-generator

将类导入控制器。

use Haruncpi\LaravelIdGenerator\IdGenerator;

现在只需使用

$prefix = "#";  
$id = IdGenerator::generate(['table' => 'your_table_name', 'length' => 9, 'prefix' =>$prefix]);

输出

#00000001
#00000002
#00000003
...

答案 2 :(得分:0)

你可以试试这个:

public function generateOrderNR()
{
    $orderObj = \DB::table('orders')->select('order_nr')->latest('id')->first();
    if ($orderObj) {
        $orderNr = $orderObj->order_nr;
        $removed1char = substr($orderNr, 1);
        $generateOrder_nr = $stpad = '#' . str_pad($removed1char + 1, 8, "0", STR_PAD_LEFT);
    } else {
        $generateOrder_nr = '#' . str_pad(1, 8, "0", STR_PAD_LEFT);
    }
    return $generateOrder_nr;
}

您可以在order_nr函数中使用$this->generateOrderNR();生成create()

此外,mt_rand()rand()快4倍,您可以将其用于更好的用户体验。

答案 3 :(得分:0)

我找到了更好的解决方案:

$paynowbillprefix1="ADDON-";
$paynowbillprefix1=strlen($paynowbillprefix1);
$query2 = "select gen_id from user_cart_addon order by id desc limit 0, 1";
$exec2 = mysqli_query($conn,$query2) or die ("Error in Query2".mysqli_error());
$res2 = mysqli_fetch_array($exec2);
$num2 = mysqli_num_rows($exec2);
$billnumber = $res2["gen_id"];
$billdigit=strlen($billnumber);
if ($billnumber == '')
{
    $billnumbercode ='ADDON-'.'1';
}
else
{
    $billnumber = $res2["gen_id"];
    $billnumbercode = substr($billnumber,$paynowbillprefix1, $billdigit);
    $billnumbercode = intval($billnumbercode);
    $billnumbercode = $billnumbercode + 1;
    $maxanum = $billnumbercode;   
    $billnumbercode = 'ADDON-'.$maxanum;
}

答案 4 :(得分:0)

使用行的自动列ID值生成订单号。但是,请勿为您的订单号创建额外的列,因为这会给您提供非规范化的数据库,因为订单列完全取决于id列。

相反,请向您的order模型添加此方法

public function get_order_number()
{
    return '#' . str_pad($this->id, 8, "0", STR_PAD_LEFT);
}

如果您的上一个订单的ID为5,并且您将其删除,那么下一个订单的ID为6

唯一可能的例外是如果您在交易中创建订单。如果回滚交易,则将跳过关联的订单ID。

答案 5 :(得分:0)

读取最大ID 并将其递增存在一个问题。 在繁重的服务器或并行请求中,两个请求可能会从MySQL读取相同的max(id)。

创建唯一序列号的最佳方法是使用只有一个自动递增字段的序列表。

  1. 首先在序列表中插入新记录。
  2. 然后通过LAST_INSERT_ID()MySQL函数从db中读取最后插入的id。
  3. 最后,您可以删除低于ID的旧记录。

Laravel方式:

$id = DB::table('seq_foo')->insertGetId(['id' => null]);
DB::table('seq_foo')->where('id', '<', $id)->delete();

$ id是您的唯一序列号。