【问题标题】:Eloquent DB::transaction saves data in the wrong orderEloquent DB::transaction 以错误的顺序保存数据
【发布时间】:2022-10-01 00:40:25
【问题描述】:

我正在为我的订单模型创建功能运行 DB::transaction。

创建订单后,我希望能够为该订单创建多个历史项目。

我的代码如下所示:


Class DataController {
    public function create () {
        $order = null;
        
        DB::transaction(function) use(&$order $data) {
            $newHistory = [
               \'order_id\' => $order->id, 
               \'text\' => \'Order created\'
            ];

            info(\'should_trigger_first\');
            $order = order::create([$data]);
            $order->histories()->save(new OrderHistory($newHistory));
        });
        
        sleep(1); // This works but it doesn\'t make sense
        
        if ($request->get(\'itemsFromOrder\')) {
           $this->processAllItemsFromOrder($request, $order->id);
        }
    
    }
    
    // In same class
    private function processAllItemsFromOrder($request, $id) {
       foreach ($request->get(\'itemsFromOrder\') as $item) {
           $order = Order::find($id);
    
           info(\'should_trigger_second\');

            $newHistory = [
               \'order_id\' => $order->id, 
               \'text\'     => \'Order item created\'
            ];

           $order->histories()->save(newOrderHistory([$newHistory]));
       }
    }
}


不知何故,我的订单项目的历史记录是首先创建的,即使交易应该事先执行。

我什至检查了数据库,不知何故,第二个历史项目的创建时间早于第一个项目

数据库如下所示:

  • 订单项已创建 - created_at: 10:28:23
  • 订单创建 - created_at: 10:28:24
  • 订单项已创建 - created_at: 10:28:24

    标签: laravel asynchronous eloquent model transactions


    【解决方案1】:

    使用 DB::transaction 的替代语法,例如

    try {
        DB::beginTransaction();
        // start code for database actions like create, update etc.
    
         
        // end code of your logic
        DB::commit(); // finally commit to database
    } catch (\Exception $e) {
        DB::rollback(); // roll back if any error occurs
        // something went wrong
    }
    

    欲了解更多信息,请访问:laravel docs

    【讨论】:

      【解决方案2】:

      似乎问题是由于我的历史模型的 created_at 时间没有正确排序而引起的。这导致了订购问题(看起来有些模型是在其他模型之前创建的)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-24
        • 1970-01-01
        • 2017-03-21
        • 1970-01-01
        • 2018-04-23
        • 1970-01-01
        • 2015-03-21
        • 2019-07-04
        相关资源
        最近更新 更多