Laravel安全地检索最后插入的记录

时间:2018-03-08 14:40:00

标签: laravel laravel-5 eloquent laravel-5.5

我将订单保存到我的数据库中,保存订单后我想获取订单ID以在确认屏幕上提取订单信息。

最新的订单ID是刚刚保存的订单ID,这一点非常重要。如果一次下达两个或多个订单,您如何确保检索到正确的ID。服务器响应时间慢可能会导致失败吗?

目前,我发现你可以做到以下几点;

$order = new Orders([
    'billing_name'          => $request->input('billing-name'),
    'billing_company'       => $request->input('company-name'),
    'billing_job_title'     => $request->input('job-title'),
    'billing_phone'         => $request->input('billing-phone'),
    'billing_email'         => $request->input('billing-email'),
    'billing_address_1'     => $request->input('billing-address-1'),
    'billing_address_2'     => $request->input('billing-address-2'),
    'billing_town'          => $request->input('billing-town'),
    'billing_county'        => $request->input('billing-county'),
    'billing_postcode'      => $request->input('billing-postcode'),
    'payment_status'        => 'Pending',
]);  

$order->save();
$recentOrder = $order->id;

我想在我的控制器中使用最近保存的ID进一步查询。

2 个答案:

答案 0 :(得分:1)

重定向到新页面后,您无法可靠地从数据库中获取ID。

您必须将其保存在某处,最好是在用户的会话中:

session(['orderId' => $order->id]);

然后在确认页面上检索它:

$order = Order::find(session('orderId'));

(不幸的是,我之前建议将订单ID添加到网址。这显然非常不安全,因为序列ID对于任何人来说都是微不足道的。)

答案 1 :(得分:0)

您可以在laravel中使用Transactions,以确保您的查询不会像在同一时间那样执行,就像您确保在处理交易时,另一个不会在前一个处理之前执行完了......

要使用事务,请将代码包装在DB::transaction中 这是你如何做到的:

DB::transaction(function () {
    // you can use this if you don't have the last_order's ID
    $last_row = DB::table('orders')->latest()->first();
    // or you get your ID from the Create operation as you did.
});