Skip to content

Commit

Permalink
Merge pull request #5403 from Laravel-Backpack/use-db-transactions
Browse files Browse the repository at this point in the history
Use db transactions in create and update operations
  • Loading branch information
promatik authored Jan 27, 2024
2 parents 935c2a4 + 74644d2 commit beef0fc
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 1 deletion.
12 changes: 12 additions & 0 deletions src/app/Library/CrudPanel/Traits/Create.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

namespace Backpack\CRUD\app\Library\CrudPanel\Traits;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;

trait Create
{
Expand All @@ -21,6 +23,16 @@ trait Create
public function create($input)
{
[$directInputs, $relationInputs] = $this->splitInputIntoDirectAndRelations($input);

if ($this->get('create.useDatabaseTransactions') ?? config('backpack.base.useDatabaseTransactions', false)) {
return DB::transaction(fn () => $this->createModelAndRelations($directInputs, $relationInputs));
}

return $this->createModelAndRelations($directInputs, $relationInputs);
}

private function createModelAndRelations(array $directInputs, array $relationInputs): Model
{
$item = $this->model->create($directInputs);
$this->createRelationsForItem($item, $relationInputs);

Expand Down
13 changes: 12 additions & 1 deletion src/app/Library/CrudPanel/Traits/Update.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

namespace Backpack\CRUD\app\Library\CrudPanel\Traits;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;

trait Update
Expand All @@ -25,7 +27,16 @@ public function update($id, $input)
$item = $this->model->findOrFail($id);

[$directInputs, $relationInputs] = $this->splitInputIntoDirectAndRelations($input);
$updated = $item->update($directInputs);
if ($this->get('update.useDatabaseTransactions') ?? config('backpack.base.useDatabaseTransactions', false)) {
return DB::transaction(fn () => $this->updateModelAndRelations($item, $directInputs, $relationInputs));
}

return $this->updateModelAndRelations($item, $directInputs, $relationInputs);
}

private function updateModelAndRelations(Model $item, array $directInputs, array $relationInputs): Model
{
$item->update($directInputs);
$this->createRelationsForItem($item, $relationInputs);

return $item;
Expand Down
11 changes: 11 additions & 0 deletions src/config/backpack/base.php
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,17 @@
// You can rename this disk here. Default: root
'root_disk_name' => 'root',

/*
|--------------------------------------------------------------------------
| Application
|--------------------------------------------------------------------------
*/

// Should we use DB transactions when executing multiple queries? For example when creating an entry and it's relationships.
// By wrapping in a database transaction you ensure that either all queries went ok, or if some failed the whole process
// is rolled back and considered failed. This is a good setting for data integrity.
'useDatabaseTransactions' => false,

/*
|--------------------------------------------------------------------------
| Backpack Token Username
Expand Down

0 comments on commit beef0fc

Please sign in to comment.