'boolean', ]; } #[Scope] protected function active(Builder $query): void { $query->where('is_active', true); } #[Scope] protected function inactive(Builder $query): void { $query->where('is_active', false); } public function getSlugOptions(): SlugOptions { return SlugOptions::create() ->generateSlugsFrom('name') ->saveSlugsTo('slug'); } public function registerMediaCollections(): void { $this->addMediaCollection('thumbnail') ->singleFile(); $this->addMediaCollection('images'); } protected function thumbnailUrl(): Attribute { return Attribute::make( get: fn () => $this->getFirstMediaUrl('thumbnail') ?: null, ); } protected function imagesData(): Attribute { return Attribute::make( get: fn () => $this->getMedia('images')->map(fn ($media) => [ 'id' => $media->id, 'url' => $media->getUrl(), ])->toArray(), ); } public function prices(): HasMany { return $this->hasMany(ProductPrice::class); } public function categories(): BelongsToMany { return $this->belongsToMany(Category::class); } }