persistOrderedColumns( $project->boardColumns() ->get() ->values(), ); } private function reorderColumns(Project $project, BoardColumn $movingColumn, int $desiredPosition): void { /** @var Collection $columns */ $columns = $project->boardColumns() ->whereKeyNot($movingColumn->id) ->get() ->values(); $insertAt = max(0, min($desiredPosition - 1, $columns->count())); $columns->splice($insertAt, 0, [$movingColumn]); $this->persistOrderedColumns($columns->values()); } /** * @param Collection $columns */ private function persistOrderedColumns(Collection $columns): void { $temporaryOffset = ((int) $columns->max('position')) + $columns->count() + 1; $columns->each(function (BoardColumn $column, int $index) use ($temporaryOffset): void { $column->forceFill([ 'position' => $temporaryOffset + $index, ])->saveQuietly(); }); $columns->each(function (BoardColumn $column, int $index): void { $column->forceFill([ 'position' => $index + 1, ])->saveQuietly(); }); } }