Laravel - 生成唯一的订单号
Laravel - generate unique order number
我目前正在尝试在用户访问创建方法时生成一个唯一的订单号。订单号在种子中是这样生成的,也需要看起来像这样
种子
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
。现在,当用户访问我的控制器中的创建方法时,需要创建此序列中的一个新的唯一订单号。我怎样才能做到这一点?控制器目前看起来像这样:
public function create()
{
$order = new Order;
$order->user_id = Auth()->id();
$order->order_nr =
dd($order);
return view('steps.order');
}
它需要检查最新的订单号并在该订单号上创建一个带有+1 的订单号。假设有 25 个订单,最后一个是 #00000025,下一个需要创建的订单是 #00000026。我怎样才能做到这一点?
尝试如下操作
$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是auto-incrementing。有关详细信息,请参阅 str_pad 方法
你可以试试这个:
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;
}
您可以通过在 create()
函数中使用 $this->generateOrderNR();
来生成 order_nr
。
此外 mt_rand()
比 rand()
快 4 倍,您可以使用它来获得更好的用户体验。
我找到了更好的解决方案:
$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;
}
使用行的自动列 ID 值生成订单号。但是,不要为您的订单号创建一个额外的列,因为这会给您一个非规范化的数据库,因为订单列完全依赖于 id 列。
相反,将此方法添加到您的order
模型
public function get_order_number()
{
return '#' . str_pad($this->id, 8, "0", STR_PAD_LEFT);
}
如果您上一个订单的 ID 为 5
,而您将其删除,那么下一个订单的 ID 为 6
。
唯一可能的例外是您在交易中创建订单。如果事务被回滚,关联的订单 ID 将被跳过。
读取最大 ID 并递增它时出现问题。
在繁重的服务器或并行请求中,两个请求可能从 MySQL.
读取相同的 max(id)
创建唯一序列号的最佳方法是使用只有一个自动递增字段的序列table。
- 首先在序列table中插入新记录。
- 然后通过LAST_INSERT_ID() MySQL函数从数据库中读取最后插入的id。
- 你终于可以删除低于你id的旧记录了。
Laravel方式:
$id = DB::table('seq_foo')->insertGetId(['id' => null]);
DB::table('seq_foo')->where('id', '<', $id)->delete();
$id 是您的唯一序列号。
您可以使用 Laravel ID generator.
首先安装它:
composer require haruncpi/laravel-id-generator
在您的控制器中导入 class。
use Haruncpi\LaravelIdGenerator\IdGenerator;
现在简单地使用它
$prefix = "#";
$id = IdGenerator::generate(['table' => 'your_table_name', 'length' => 9, 'prefix' =>$prefix]);
输出
#00000001
#00000002
#00000003
...
我目前正在尝试在用户访问创建方法时生成一个唯一的订单号。订单号在种子中是这样生成的,也需要看起来像这样
种子
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
。现在,当用户访问我的控制器中的创建方法时,需要创建此序列中的一个新的唯一订单号。我怎样才能做到这一点?控制器目前看起来像这样:
public function create()
{
$order = new Order;
$order->user_id = Auth()->id();
$order->order_nr =
dd($order);
return view('steps.order');
}
它需要检查最新的订单号并在该订单号上创建一个带有+1 的订单号。假设有 25 个订单,最后一个是 #00000025,下一个需要创建的订单是 #00000026。我怎样才能做到这一点?
尝试如下操作
$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是auto-incrementing。有关详细信息,请参阅 str_pad 方法
你可以试试这个:
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;
}
您可以通过在 create()
函数中使用 $this->generateOrderNR();
来生成 order_nr
。
此外 mt_rand()
比 rand()
快 4 倍,您可以使用它来获得更好的用户体验。
我找到了更好的解决方案:
$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;
}
使用行的自动列 ID 值生成订单号。但是,不要为您的订单号创建一个额外的列,因为这会给您一个非规范化的数据库,因为订单列完全依赖于 id 列。
相反,将此方法添加到您的order
模型
public function get_order_number()
{
return '#' . str_pad($this->id, 8, "0", STR_PAD_LEFT);
}
如果您上一个订单的 ID 为 5
,而您将其删除,那么下一个订单的 ID 为 6
。
唯一可能的例外是您在交易中创建订单。如果事务被回滚,关联的订单 ID 将被跳过。
读取最大 ID 并递增它时出现问题。 在繁重的服务器或并行请求中,两个请求可能从 MySQL.
读取相同的 max(id)创建唯一序列号的最佳方法是使用只有一个自动递增字段的序列table。
- 首先在序列table中插入新记录。
- 然后通过LAST_INSERT_ID() MySQL函数从数据库中读取最后插入的id。
- 你终于可以删除低于你id的旧记录了。
Laravel方式:
$id = DB::table('seq_foo')->insertGetId(['id' => null]);
DB::table('seq_foo')->where('id', '<', $id)->delete();
$id 是您的唯一序列号。
您可以使用 Laravel ID generator.
首先安装它:
composer require haruncpi/laravel-id-generator
在您的控制器中导入 class。
use Haruncpi\LaravelIdGenerator\IdGenerator;
现在简单地使用它
$prefix = "#";
$id = IdGenerator::generate(['table' => 'your_table_name', 'length' => 9, 'prefix' =>$prefix]);
输出
#00000001
#00000002
#00000003
...