ldc-volena/app/Traits/Controllers/UpdateModelOrder.php

48 lines
1.6 KiB
PHP
Raw Permalink Normal View History

<?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 {
/** @phpstan-ignore-next-line */
$groupField = $model->getOrderGroupField();
$query = $model::query()
->whereKeyNot($model)
/** @phpstan-ignore-next-line */
->whereBetween('order', [min($model->order, $newOrder), max($model->order, $newOrder)]);
if ($groupField) {
$query->where($groupField, $model->{$groupField});
}
/** @phpstan-ignore-next-line */
$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'));
});
}
}