Laravel - 生成唯一的订单号

Rai*_*aan 5 php laravel laravel-4 laravel-5

我正在尝试在用户到达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(),

        ]);
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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


    dd($order);


    return view('steps.order');
}
Run Code Online (Sandbox Code Playgroud)

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

Kal*_*kar 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();
Run Code Online (Sandbox Code Playgroud)

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

  • 这样做对我来说.谢谢! (2认同)

Ada*_*dam 5

使用行的自动列 ID 值来生成订单号。但是,不要为订单号创建额外的列,因为这会给您一个非标准化的数据库,因为订单列完全依赖于 id 列。

相反,将此方法添加到您的order模型中

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

如果您的上一个订单具有 id5并且您将其删除,那么下一个订单将具有 id 6

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


Har*_*run 5

您可以使用Laravel ID 生成器

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

将类导入到您的控制器中。

use Haruncpi\LaravelIdGenerator\IdGenerator;
Run Code Online (Sandbox Code Playgroud)

现在只需使用它

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

输出

#00000001
#00000002
#00000003
...
Run Code Online (Sandbox Code Playgroud)