ldc-boutique-cnc/app/Traits/Controllers/ChangesModelOrder.php
2023-03-13 14:34:35 +01:00

46 lines
1.7 KiB
PHP

<?php
namespace App\Traits\Controllers;
use App\Http\Requests\Bo\ChangeOrderRequest;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;
trait ChangesModelOrder
{
/**
* Change order
*
* ! requires x64 server + order column as unique integer
*
* @param \App\Http\Requests\Bo\ChangeOrderRequest $request
* @param \Illuminate\Database\Eloquent\Model $model
* @return \Illuminate\Http\RedirectResponse
* @throws \RuntimeException Si le nom du parametre de la route ne correspond pas au model utilisé.
*/
public function changeOrder(ChangeOrderRequest $request, Model $model): RedirectResponse
{
return DB::transaction(function () use ($request, $model) {
/** @var \Illuminate\Database\Eloquent\Model|null */
$tmp = (\get_class($model))::where('order', $request->direction ? '<' : '>', $model->order)
->orderBy('order', $request->direction ? 'DESC' : 'ASC')->first();
if (!$tmp) {
return back()->with('bo.error', trans('L\'ordre n\'a pas pu être modifié'));
}
$oldOrder = $model->order;
$newOrder = $tmp->order;
// ! Fake value to prevent unique SQL key to trigger.
$tmp->order = 4294967295;
$tmp->saveOrFail();
$model->order = $newOrder;
$model->saveOrFail();
$tmp->order = $oldOrder;
$tmp->saveOrFail();
Session::flash('bo.success', trans('L\'ordre a été modifié'));
return back();
});
}
}