ldc-volena/app/Traits/Controllers/UpdateModelOrder.php
2026-03-13 14:28:53 +01:00

44 lines
1.4 KiB
PHP

<?php
namespace App\Traits\Controllers;
use App\Http\Requests\Bo\UpdateOrderRequest;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\DB;
trait UpdateModelOrder
{
/**
* Updates the model order and shifts affected siblings accordingly
*
* @param UpdateOrderRequest $request
* @param Model $model
* @return \Illuminate\Http\RedirectResponse
*/
public function changeCustomOrder(UpdateOrderRequest $request, Model $model): \Illuminate\Http\RedirectResponse
{
$newOrder = $request->validated('order');
return DB::transaction(function () use ($model, $newOrder): RedirectResponse {
$groupField = $model->getOrderGroupField();
$query = $model::query()
->whereKeyNot($model)
->whereBetween('order', [min($model->order, $newOrder), max($model->order, $newOrder)]);
if ($groupField) {
$query->where($groupField, $model->{$groupField});
}
$model->order < $newOrder ? $query->decrement('order', 1) : $query->increment('order', 1);
$model->order = $newOrder;
if (!$model->saveOrFail()) {
return back()->with('error', trans('crud.messages.order_not_changed'));
};
return back()->with('success', trans('crud.messages.order_changed'));
});
}
}