diff --git a/src/Models/Media.php b/src/Models/Media.php index df07698..bc79130 100644 --- a/src/Models/Media.php +++ b/src/Models/Media.php @@ -2,6 +2,7 @@ namespace Finller\Media\Models; +use Closure; use Finller\Media\Casts\GeneratedConversion; use Finller\Media\Casts\GeneratedConversions; use Finller\Media\Enums\MediaType; @@ -12,6 +13,7 @@ use Finller\Media\Traits\InteractsWithMediaFiles; use Illuminate\Database\Eloquent\Casts\ArrayObject; use Illuminate\Database\Eloquent\Casts\AsArrayObject; +use Illuminate\Database\Eloquent\Collection as EloquentCollection; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Http\File as HttpFile; @@ -35,7 +37,7 @@ * @property ?int $height * @property ?float $aspect_ratio * @property ?string $average_color - * @property ?int $order_column + * @property ?string $order * @property ?Collection $generated_conversions * @property ?ArrayObject $metadata * @property ?Model $model @@ -404,4 +406,31 @@ public function getSrcset(): Collection return $this->getResponsiveImages() ->map(fn (GeneratedConversion $generatedConversion) => $generatedConversion->getUrl().' '.$generatedConversion->width.'w'); } + + /** + * @param null|(Closure(string $previous): string) $sequence + */ + public static function reorder(array $ids, ?Closure $sequence = null): void + { + /** @var EloquentCollection */ + $models = static::query() + ->whereIn('id', $ids) + ->get(); + + $models = $models->sortBy(function (Media $model) use ($ids) { + return array_search($model->getKey(), $ids); + }); + + $previous = $sequence ? null : -1; + + foreach ($models as $model) { + + $model->order = $sequence ? value($sequence, $previous) : ($previous+1); + + $previous = $model->order; + + $model->save(); + } + + } } diff --git a/tests/Feature/MediaTest.php b/tests/Feature/MediaTest.php index d6c10bd..4b783bb 100644 --- a/tests/Feature/MediaTest.php +++ b/tests/Feature/MediaTest.php @@ -383,3 +383,21 @@ Storage::disk('media')->assertMissing($generatedConversion->path); Storage::disk('media')->assertMissing($nestedGeneratedConversion->path); }); + +it('reorder models', function () { + + $first_media = MediaFactory::new()->create(['order' => '0']); + $second_media = MediaFactory::new()->create(['order' => '1']); + $third_media = MediaFactory::new()->create(['order' => '2']); + + Media::reorder([ + $third_media->getKey(), + $first_media->getKey(), + $second_media->getKey(), + ]); + + expect($third_media->refresh()->order)->toBe('0'); + expect($first_media->refresh()->order)->toBe('1'); + expect($second_media->refresh()->order)->toBe('2'); + +});