'int', 'destination_city_id' => 'int', 'file_id' => 'int', 'tour_mode'=> TourMode::class, 'tour_scope' => TourScope::class, 'tour_type' => TourType::class, 'views_count' => 'int' ]; protected $fillable = [ 'title', 'summary', 'description', 'origin_city_id', 'destination_city_id', 'file_id', 'tour_type', 'tour_mode', 'tour_scope', 'views_count' ]; #[Scope] protected function applySort(Builder $query, ?string $sort = null): void { $query->withMin('tourDepartures', 'price') ->withMax('tourDepartures', 'price'); switch ($sort) { case 'lowest': $query->orderBy('tour_departures_min_price'); break; case 'highest': $query->orderByDesc('tour_departures_max_price'); break; default: $query->orderByDesc('id'); break; } } public function originCity() { return $this->belongsTo(City::class, 'origin_city_id'); } public function city() { return $this->belongsTo(City::class, 'destination_city_id'); } public function tourDepartures() { return $this->hasMany(TourDeparture::class , 'tour_id'); } public function file() { return $this->belongsTo(File::class, 'file_id'); } public function comments() { return $this->hasMany(Comment::class, 'tour_id'); } public function favorites() { return $this->hasMany(Favorite::class); } public function images() { return $this->hasMany(TourImage::class) ->orderBy('sort_order'); } public function coverImage() { return $this->hasOne(TourImage::class) ->where('is_default', true); } }