Home > database >  Eloquent DB::transaction saves data in the wrong order
Eloquent DB::transaction saves data in the wrong order

Time:09-22

I'm running a DB::transaction for my order model create function.

Once the order is created I want to be able to create multiple history items for that order.

My code looks like this:


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]));
       }
    }
}


Somehow the history for my order items are created first even though the transaction should run of been executed beforehand.

I even checked the database and somehow the created at of the second history items are earlier than the first item

Database looks like this:

  • Orderitem created - created_at: 10:28:23
  • Order created - created_at: 10:28:24
  • Orderitem created - created_at: 10:28:24

CodePudding user response:

Use the alternative syntax for DB::transaction like

DB::beginTransaction();

try {
    // database actions like create, update etc.

    DB::commit(); // finally commit to database
} catch (\Exception $e) {
    DB::rollback(); // roll back if any error occurs
    // something went wrong
}

For more information visit: laravel docs

CodePudding user response:

Seems like the problem was caused because the created_at time for my history models was not being sorted correctly. Which caused problems in ordering (making it seem like some models were created before others).

  • Related