$comments * @property-read int|null $comments_count * @property-read \Illuminate\Database\Eloquent\Collection $likes * @property-read int|null $likes_count * @property-read \Illuminate\Database\Eloquent\Collection $tags * @property-read int|null $tags_count * @property-read \Illuminate\Database\Eloquent\Collection $views * @property-read int|null $views_count * * @method static \Illuminate\Database\Eloquent\Builder|Recipe containsTag($tagString) * @method static \Database\Factories\RecipeFactory factory($count = null, $state = []) * @method static \Illuminate\Database\Eloquent\Builder|Recipe negativeComments() * @method static \Illuminate\Database\Eloquent\Builder|Recipe newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|Recipe newQuery() * @method static \Illuminate\Database\Eloquent\Builder|Recipe orderByUniqueViews(string $direction = 'desc', $period = null, ?string $collection = null, string $as = 'unique_views_count') * @method static \Illuminate\Database\Eloquent\Builder|Recipe orderByViews(string $direction = 'desc', ?\CyrildeWit\EloquentViewable\Support\Period $period = null, ?string $collection = null, bool $unique = false, string $as = 'views_count') * @method static \Illuminate\Database\Eloquent\Builder|Recipe positiveComments() * @method static \Illuminate\Database\Eloquent\Builder|Recipe query() * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereCookingTime($value) * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereCreatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereDescription($value) * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereId($value) * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereImage($value) * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereIngredients($value) * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereSlug($value) * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereState($value) * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereSteps($value) * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereTitle($value) * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereType($value) * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereVideoUrl($value) * @method static \Illuminate\Database\Eloquent\Builder|Recipe withViewsCount(?\CyrildeWit\EloquentViewable\Support\Period $period = null, ?string $collection = null, bool $unique = false, string $as = 'views_count') * * @mixin \Eloquent */ class Recipe extends Model implements Viewable { use HasFactory; use InteractsWithViews; use HasSlug; protected $casts = [ 'steps' => AsCollection::class, 'ingredients' => AsCollection::class, ]; protected $withCount = [ 'likes', 'comments', ]; public function getSlugOptions(): SlugOptions { return SlugOptions::create() ->generateSlugsFrom(['title']) ->saveSlugsTo('slug') // ->slugsShouldBeNoLongerThan(20) ->usingSeparator('_'); // ->usingLanguage('ru') // ->doNotGenerateSlugsOnUpdate(); } public function getRouteKeyName(): string { return 'slug'; } public function tags(): MorphToMany { return $this->morphToMany(Tag::class, 'taggable'); } public function author(): HasOneThrough { return $this ->hasOneThrough(User::class, RecipeAuthor::class, 'recipe_id', 'id', 'id', 'user_id') ->withDefault( [ 'name' => 'Guest Author', 'id' => 0, 'profile_photo_url' => 'https://dev2.eatvio.com/storage/profile-photos/mW87tqy9P8O31Dauyvg8f7GowMNMsgt9J6u47T7S.jpg', ] ); } public function comments(): HasMany { return $this->hasMany(RecipeComment::class); } public function likes(): HasMany { return $this->hasMany(RecipeLike::class); } public function scopeNegativeComments(Builder $query): Builder { return static::comments()->where('grade', '<=', '3'); } public function scopePositiveComments(Builder $query): Builder { return static::comments()->where('grade', '>', '3'); } public function isLiked(): bool|int { $curUser = auth()->user(); if ($curUser) { return $curUser->recipe_likes()->forRecipe($this)->count(); } return false; } public function removeLike(): bool|int { $curUser = auth()->user(); if ($curUser) { return $curUser->recipe_likes()->forRecipe($this)->delete(); } return false; } public function scopeContainsTag(Builder $query, string $tagString): Builder { $tagId = Str::of($tagString)->split('/-/')->first(); return Tag::find($tagId)->recipes(); } }