feat:complete flight blade and controller

This commit is contained in:
2026-08-17 11:55:52 +03:30
parent e426ce4e44
commit de7ddfef1d
4 changed files with 130 additions and 11 deletions
+9
View File
@@ -0,0 +1,9 @@
<?php
namespace App\Enums;
enum FlightStatus: int
{
case DISABLE = 0;
case ENABLE = 1;
}
+72
View File
@@ -2,9 +2,81 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Enums\CommentStatus;
use App\Enums\FlightStatus;
use App\Models\Flight;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class FlightController extends Controller class FlightController extends Controller
{ {
public function index(Request $request)
{
$passengers =
$request->input('adult', 0) +
$request->input('children', 0);
$flights = Flight::query()
->where('status', FlightStatus::ENABLE)
->applyFilter()
->when($request->filled('from-destination'), function (Builder $query) use ($request) {
$from = $request->input('from-destination');
$query->whereHas('departureAirport.city', function ($query) use ($from) {
$query->where('name', 'LIKE', "%$from%");
});
})
->when($request->filled('to-destination'), function (Builder $query) use ($request) {
$to = $request->input('to-destination');
$query->whereHas('arrivalAirport.city', function ($query) use ($to) {
$query->where('name', 'LIKE', "%$to%");
});
})
// ->when($request->filled('journey-date'), function (Builder $query) use ($request) {
// $date = $request->input('journey-date');
//
// $query->whereDate('departure_time', $date);
// })
->when($passengers > 0, function (Builder $query) use ($passengers) {
$query->where('capacity', '>=', $passengers);
})
->with([
'departureAirport.city',
'arrivalAirport.city',
'airline',
'file',
])
->orderByDesc('created_at')
->paginate();
return view('flights.index', compact('flights'));
}
public function show(Flight $flight)
{
abort_if(
$flight->status !== FlightStatus::ENABLE->value,
404
);
$flight->increment('views');
$flight->load([
'departureAirport.city',
'arrivalAirport.city',
'airline',
'file',
'comments' => function ($query) {
$query
->where('status', CommentStatus::APPROVED)
->with('user')
->orderByDesc('created_at');
},
]);
return view('flights.show', compact('flight'));
}
} }
+15
View File
@@ -7,6 +7,8 @@
namespace App\Models; namespace App\Models;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Contracts\Database\Query\Builder;
use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
@@ -51,6 +53,7 @@ class Flight extends Model
'departure_time' => 'datetime', 'departure_time' => 'datetime',
'price' => 'float', 'price' => 'float',
'capacity' => 'int', 'capacity' => 'int',
'views' => 'int',
'status' => 'int' 'status' => 'int'
]; ];
@@ -61,6 +64,7 @@ class Flight extends Model
'file_id', 'file_id',
'title', 'title',
'summary', 'summary',
'views',
'flight_type', 'flight_type',
'departure_time', 'departure_time',
'price', 'price',
@@ -102,4 +106,15 @@ class Flight extends Model
{ {
return $this->hasMany(Favorite::class); return $this->hasMany(Favorite::class);
} }
#[Scope]
protected function applyFilter(Builder $query): void
{
$request = request();
if ($request->filled('flight_type')) {
$query->where('flight_type', $request->input('flight_type'));
}
}
} }
+34 -11
View File
@@ -1,42 +1,65 @@
<div class="row align-items-center">
<div class="col-md-6 col-lg-3"> <div class="col-md-6 col-lg-3">
<div class="flight-item"> <div class="flight-item">
<div class="flight-img"> <div class="flight-img">
<img src="assets/img/flight/01.jpg" alt> <img src="assets/img/flight/01.jpg" alt>
<a href="#" class="add-wishlist"><i class="far fa-heart"></i></a>
<a href="#" class="add-wishlist">
<i class="far fa-heart"></i>
</a>
</div> </div>
<div class="flight-content"> <div class="flight-content">
<div class="flight-title"> <div class="flight-title">
<div class="flight-title-info"> <div class="flight-title-info">
<img src="assets/img/flight/airline-1.png" alt> <img src="assets/img/flight/airline-1.png" alt>
<h4><a href="#">
<h4>
<a href="#">
{{ $flight->departureAirport->city->name }} {{ $flight->departureAirport->city->name }}
<i class="far fa-exchange"></i> <i class="far fa-exchange"></i>
{{ $flight->arrivalAirport->city->name }} {{ $flight->arrivalAirport->city->name }}
</a> </a>
</h4> </h4>
</div> </div>
<p class="flight-date"> <p class="flight-date">
<i class="far fa-calendar-days"></i> <i class="far fa-calendar-days"></i>
{{ $flight->departure_time->toJalali()->format('Y/m/d H:i')}}
{{ $flight->departure_time->toJalali()->format('Y/m/d H:i') }}
</p> </p>
</div> </div>
<div class="flight-bottom"> <div class="flight-bottom">
<div class="flight-price"> <div class="flight-price">
از از
<span> <span>
{{ number_format($flight->price) }} تومان {{ number_format($flight->price) }} تومان
</span> </span>
</div> </div>
<div class="flight-text-btn"> <div class="flight-text-btn">
<a href="#">نمایش جزئیات <i class="fas fa-arrow-left"></i></a> <a href="{{route('flights.show',$flight->id)}}">
نمایش جزئیات
<i class="fas fa-arrow-left"></i>
</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="text-center mt-3">
<a href="#" class="theme-btn">بیشتر پیدا کن<i class="far fa-arrow-left"></i></a>
</div>
</div>