2026-03-13 11:52:48 +01:00
|
|
|
<?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
|
2026-03-13 15:46:34 +01:00
|
|
|
* @param Model $model
|
2026-03-13 11:52:48 +01:00
|
|
|
* @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 {
|
2026-03-13 15:46:34 +01:00
|
|
|
/** @phpstan-ignore-next-line */
|
2026-03-13 11:52:48 +01:00
|
|
|
$groupField = $model->getOrderGroupField();
|
|
|
|
|
|
|
|
|
|
$query = $model::query()
|
|
|
|
|
->whereKeyNot($model)
|
2026-03-13 15:46:34 +01:00
|
|
|
/** @phpstan-ignore-next-line */
|
2026-03-13 11:52:48 +01:00
|
|
|
->whereBetween('order', [min($model->order, $newOrder), max($model->order, $newOrder)]);
|
|
|
|
|
|
|
|
|
|
if ($groupField) {
|
|
|
|
|
$query->where($groupField, $model->{$groupField});
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-13 15:46:34 +01:00
|
|
|
/** @phpstan-ignore-next-line */
|
2026-03-13 11:52:48 +01:00
|
|
|
$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'));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|