feat: implement flight sorting and pagination

This commit is contained in:
2026-08-17 16:39:25 +03:30
parent 9dc27863e2
commit 27c83621fb
3 changed files with 60 additions and 18 deletions
+9 -5
View File
@@ -10,15 +10,19 @@ class FlightController extends Controller
{
public function index(Request $request)
{
$sort = $request->query('sort', 'default');
$flights = Flight::with(['airline', 'origin_airport', 'airport'])
->where('status', '=', FlightStatus::AVAILABLE)
$sort = $request->query('sort', 'default');
$title = 'پروازها';
$flights = Flight::with(['airline', 'origin_airport.city', 'airport.city'])
->where('status', FlightStatus::AVAILABLE)
->filterFrom($request->input('from-destination'))
->filterTo($request->input('to-destination'))
->filterDepartureDate($request->input('journey-date'))
->applySort($sort)
->paginate(4)
->appends(['sort' => $sort]);
->withQueryString();
$title = 'پروازها';
return view('flights.index', compact('title', 'flights', 'sort'));
}
+33
View File
@@ -9,6 +9,7 @@ namespace App\Models;
use App\Enums\FlightStatus;
use App\Enums\FlightTripType;
use Carbon\Carbon;
use Hekmatinasser\Verta\Verta;
use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
@@ -89,10 +90,42 @@ class Flight extends Model
}
}
#[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()
{