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).