$models */ private function persistOrderedModels(Collection $models): void { $temporaryOffset = ((int) $models->max('position')) + $models->count() + 1; $models->each(function (Model $model, int $index) use ($temporaryOffset): void { $model->forceFill([ 'position' => $temporaryOffset + $index, ])->saveQuietly(); }); $models->each(function (Model $model, int $index): void { $model->forceFill([ 'position' => $index + 1, ])->saveQuietly(); }); } /** * @param Collection $existingModels */ private function reorderModels(Collection $existingModels, Model $movingModel, int $desiredPosition): void { $insertAt = max(0, min($desiredPosition - 1, $existingModels->count())); $existingModels->splice($insertAt, 0, [$movingModel]); $this->persistOrderedModels($existingModels->values()); } }