belongsToMany(User::class, 'diet_author', 'diet_id', 'user_id'); /*->withDefault( [ 'name' => 'Guest Author', 'id' => 0, 'profile_photo_url' => 'https://dev2.eatvio.com/storage/profile-photos/mW87tqy9P8O31Dauyvg8f7GowMNMsgt9J6u47T7S.jpg' ] );*/ } public function comments() { return $this->hasMany(DietComment::class); } public function likes(): HasMany { return $this->hasMany(DietLike::class); } public function isLiked(): bool { if (auth()->user()) { return auth()->user()->diet_likes()->forDiet($this)->count(); } return false; } public function removeLike(): bool { if (auth()->user()) { return auth()->user()->diet_likes()->forDiet($this)->delete(); } return false; } public function types(): Attribute { $data = $this->unserializeOptionsArr($this->type); return new Attribute( get: fn() => array_keys($data), ); } public function schedules(): Attribute { $data = $this->unserializeOptionsArr($this->daily_schedule); return new Attribute( get: fn() => $data, ); } public function choses() { return $this->hasMany(ChosenDiet::class); } private function unserializeOptionsArr($str) { if (preg_match('/^".*"$/', $str)) { return json_decode(stripslashes(mb_substr($str, 1, -1)), true); } return json_decode(stripslashes($str), true); } public function scopeDurationMin(Builder $query, $days): Builder { return $query->where('duration', '>=', $days); } public function scopeDurationMax(Builder $query, $days): Builder { return $query->where('duration', '<=', $days); } public function scopeInvolvedMin(Builder $query, $number): Builder { return $query->having('choses_count', '>=', $number); } public function scopeInvolvedMax(Builder $query, $number): Builder { return $query->having('choses_count', '<=', $number); } public function scopeContainsType(Builder $query, $types): Builder { $i = 0; foreach($types as $type) { if (in_array($type, $this->allowedDietTypes)) { $query = $i == 0 ? $query->whereJsonContainsKey('type->' . $type) : $query->orWhereJsonContainsKey('type->' . $type); $i++; } } return $query; } }