$products * * @mixin \Eloquent */ #[Fillable([ 'name', 'description', 'picture', 'picture_alt', 'picture_title', 'status', ])] class Range extends Model implements ModelWithOrder, ModelWithStatus, RedirectableInterface { use HasOrder; use HasStatus; use IsRedirectable; #[\Override] protected static function booted() { static::creating(function (self $model): void { self::manageFields($model); }); static::updating(function (self $model): void { self::manageFields($model); }); static::deleting(function (self $model): void { FileStorageHelper::removeFile($model, 'picture'); }); } #[\Override] public function getRouteKeyName(): string { return 'slug'; } /** @return string[]|string */ #[\Override] public function getFrontUrl(string $modelKey): array | string { return route('fo.products.index') . '#' . http_build_query([ 'ranges' => [$modelKey], ]); } private static function manageFields(self $model): void { self::assertNameIsUnique($model->name, $model->id); $model->slug = Str::slug($model->name); $model->picture = FileStorageHelper::storeFile($model, $model->picture, true); if (is_null($model->order)) { $maxOrder = self::query()->max('order'); $model->order = is_numeric($maxOrder) ? (int) $maxOrder + 1 : 0; } } private static function assertNameIsUnique(?string $name, ?int $id = null): void { $table = new self()->getTable(); ToolboxHelper::assertFieldIsUnique($table, 'name', $name, $id); ToolboxHelper::assertFieldIsUnique($table, 'slug', Str::slug($name ?? ''), $id); } /** @return \Illuminate\Database\Eloquent\Relations\HasMany<\App\Models\Product,$this> */ public function products(): HasMany { return $this->hasMany(Product::class, 'range_id'); } #[\Override] protected function casts(): array { return [ 'status' => 'bool', ]; } }