我正在建立一个系统,在这个系统中,我有一段代码,它使用created_at字段检查最新的“Order”,并检查最新的“Order_nr”,并在创建新的时候创建{ {1}} +1。这是我正在谈论的代码
order_nr
这使得每个订单号都是唯一的。当我为数据库播种时,时间戳都是一样的。现在,当我尝试通过执行上面的代码保存订单时,我收到以下错误:
SQLSTATE [23000]:完整性约束违规:1062键'order_order_nr_unique'的重复条目'#00000002'(SQL:插入
$order = new Order; $order->user_id = Auth()->id(); $latestOrder = Order::orderBy('created_at', 'DESC')->first(); $order->order_nr = '#'.str_pad($latestOrder->id + 1, 8, "0", STR_PAD_LEFT); $order->sub_total = $subtotal; $order->vat = $vat; $order->price_sum = $priceSum; $order->save();
orders
,user_id
,{{1 }},order_nr
,sub_total
,vat
,price_sum
)值(1,#00000002,18.12,3.8052,21.9252,2018-03-28 07:30:51 ,2018-03-28 07:30:51))
当我将最新订单的时间更改为一秒后,代码工作正常。我怎么解决这个问题?执行此操作的最佳方法是什么?
答案 0 :(得分:0)
使用此
我认为你的网站一次有很多用户,而且一个用户想要一次订购,所以我建议使用一些随机数然后绑定id
$latestOrder = rand() . Order::orderBy('id', 'DESC')->first();
答案 1 :(得分:0)
一种选择是使用count()
std::cin
另一个选择是按ID DESC排序:
$order = new Order;
$order->user_id = Auth()->id();
$totalOrder = Order::orderBy('created_at', 'DESC')->count();
$order->order_nr = '#'.str_pad($totalOrder + 1, 8, "0", STR_PAD_LEFT);
$order->sub_total = $subtotal;
$order->vat = $vat;
$order->price_sum = $priceSum;
$order->save();
答案 2 :(得分:0)
如果order by的值相同,则SQl查询会维护原始订单,因此您的查询不会为您提供最后一条记录,而是为您提供第一行表格。
尝试自动递增order_nr或者不是先使用desc命令,找到order_nr的最大值然后再做+1