'int', 'origin_airport_id' => 'int', 'destination_airport_id' => 'int', 'file_id' => 'int', 'departure_time' => 'datetime', 'price' => 'int', 'capacity' => 'int', 'status' => FlightStatus::class, 'trip_type' => FlightTripType::class, 'views_count' => 'int' ]; protected $fillable = [ 'airline_id', 'origin_airport_id', 'destination_airport_id', 'file_id', 'flight_number', 'departure_time', 'price', 'capacity', 'status', 'trip_type', 'views_count' ]; #[Scope] protected function applySort(Builder $query, ?string $sort = null): void { switch ($sort) { case 'popularity': $query->withCount('bookings')->orderByDesc('bookings_count'); break; case 'lowest': $query->orderBy('price'); break; case 'highest': $query->orderByDesc('price'); break; default: $query->orderByDesc('id'); break; } } #[Scope] protected function filterFrom(Builder $query, ?string $cityName = null): void { if ($cityName) { $query->whereHas('origin_airport.city', function (Builder $q) use ($cityName) { $q->where('name', 'LIKE', "%$cityName%"); }); } } #[Scope] protected function filterTo(Builder $query, ?string $cityName = null): void { if ($cityName) { $query->whereHas('airport.city', function (Builder $q) use ($cityName) { $q->where('name', 'LIKE', "%$cityName%"); }); } } public function airline() { return $this->belongsTo(Airline::class); } #[Scope] protected function filterDepartureDate(Builder $query, ?string $dateInput = null): void { if (!$dateInput) { return; } $date = Verta::parse($dateInput)->datetime(); $query->whereDate('departure_time', $date->format('Y-m-d')); } public function origin_airport() { return $this->belongsTo(Airport::class, 'origin_airport_id'); } public function airport() { return $this->belongsTo(Airport::class, 'destination_airport_id'); } public function file() { return $this->belongsTo(File::class); } public function bookings() { return $this->hasMany(Booking::class); } public function comments() { return $this->hasMany(Comment::class, 'flight_id'); } public function favorites() { return $this->hasMany(Favorite::class); } }