$activityLogs * @property-read array $translatable_columns_from * @property-read \Illuminate\Database\Eloquent\Collection $products * @property-read mixed $translations * * @method static \Database\Factories\RecipeFactory factory($count = null, $state = []) * @method static \Illuminate\Database\Eloquent\Builder|Recipe onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereJsonContainsLocale(string $column, string $locale, ?mixed $value, string $operand = '=') * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereJsonContainsLocales(string $column, array $locales, ?mixed $value, string $operand = '=') * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereLocale(string $column, string $locale) * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereLocales(string $column, array $locales) * @method static \Illuminate\Database\Eloquent\Builder|Recipe withTrashed(bool $withTrashed = true) * @method static \Illuminate\Database\Eloquent\Builder|Recipe withoutTrashed() * * @mixin \Eloquent */ // phpcs:enable Generic.Files.LineLength.TooLong class Recipe extends Model implements TranslatableModel { use HasActivityLog; use HasCache; /** @use HasFactory<\Database\Factories\RecipeFactory> */ use HasFactory; use HasModelNaming; use HasTranslations; use HasUuids; use HasUwilImages; use Searchable; use SoftDeletes; protected $fillable = [ 'seo_title', 'seo_description', 'picture', 'picture_alt', 'picture_title', 'name', 'product_category', 'consomption_time', 'inspiration', 'season', 'description', 'details', 'ingredients_list', 'preparation_steps', 'tips_and_advices', ]; protected $casts = [ 'product_category' => ProductCategory::class, 'consomption_time' => ConsumptionTime::class, 'inspiration' => Inspiration::class, 'season' => Season::class, ]; public function newUniqueId(): string { return Uuid::uuid7()->toString(); } public function getId(): RecipeId { return new RecipeId(Uuid::fromString($this->id)); } #[\Override] protected static function booted(): void { static::saving(function (self $model): void { self::manageFields($model); }); static::deleting(function (self $model): void { FileStorageHelper::removeFile($model, 'picture'); }); } /** @return \Illuminate\Database\Eloquent\Relations\BelongsToMany<\App\Models\Product,$this> */ public function products(): BelongsToMany { return $this->belongsToMany(Product::class); } /** * Relations should be share to views. * * @return array */ public static function getPropsRelations(): array { return self::getCacheRelations(); } 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); } private static function assertNameIsUnique(?string $name, string | int | null $id = null): void { $table = new self()->getTable(); ToolboxHelper::assertFieldIsUnique($table, 'name', $name, $id); ToolboxHelper::assertFieldIsUnique($table, 'slug', Str::slug($name ?? ''), $id); } /** * Get the indexable data array for the model. * * @return array */ public function toSearchableArray(): array { return [ 'id' => $this->id, 'name' => $this->name, 'product_category' => $this->product_category?->value, 'consomption_time' => $this->consomption_time?->value, 'inspiration' => $this->inspiration?->value, 'season' => $this->season?->value, ]; } }