From 021a66cfc9463129423fc194b3f403aec78bd3cf Mon Sep 17 00:00:00 2001 From: mina-esn Date: Thu, 20 Aug 2026 11:58:45 +0330 Subject: [PATCH] feat: add tour enums, update Tour model, and create TourImage relation --- app/Enums/Admin/Tour/TourMode.php | 17 ++++++++++ app/Enums/Admin/Tour/TourScope.php | 17 ++++++++++ app/Enums/Admin/Tour/TourType.php | 22 +++++++++++++ app/Models/Tour.php | 33 ++++++++++++++----- app/Models/TourImage.php | 53 ++++++++++++++++++++++++++++++ 5 files changed, 133 insertions(+), 9 deletions(-) create mode 100644 app/Enums/Admin/Tour/TourMode.php create mode 100644 app/Enums/Admin/Tour/TourScope.php create mode 100644 app/Enums/Admin/Tour/TourType.php create mode 100644 app/Models/TourImage.php diff --git a/app/Enums/Admin/Tour/TourMode.php b/app/Enums/Admin/Tour/TourMode.php new file mode 100644 index 0000000..cdd3177 --- /dev/null +++ b/app/Enums/Admin/Tour/TourMode.php @@ -0,0 +1,17 @@ + 'زمینی', + self::LAND => 'هوایی', + }; + } +} diff --git a/app/Enums/Admin/Tour/TourScope.php b/app/Enums/Admin/Tour/TourScope.php new file mode 100644 index 0000000..6d6e691 --- /dev/null +++ b/app/Enums/Admin/Tour/TourScope.php @@ -0,0 +1,17 @@ + 'داخلی', + self::INTERNATIONAL => 'خارجی', + }; + } +} diff --git a/app/Enums/Admin/Tour/TourType.php b/app/Enums/Admin/Tour/TourType.php new file mode 100644 index 0000000..6a158d2 --- /dev/null +++ b/app/Enums/Admin/Tour/TourType.php @@ -0,0 +1,22 @@ + 'تفریحی', + self::TOURISM => 'گردشگری', + self::PILGRIMAGE => 'زیارتی', + self::ECO_TOURISM => 'طبیعت‌گردی' + }; + } +} diff --git a/app/Models/Tour.php b/app/Models/Tour.php index 4b0baba..3de3fba 100644 --- a/app/Models/Tour.php +++ b/app/Models/Tour.php @@ -6,11 +6,15 @@ namespace App\Models; +use App\Enums\Admin\Tour\TourMode; +use App\Enums\Admin\Tour\TourScope; +use App\Enums\Admin\Tour\TourType; use Carbon\Carbon; use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\SoftDeletes; /** * Class Tour @@ -34,6 +38,7 @@ use Illuminate\Database\Eloquent\Model; */ class Tour extends Model { + use SoftDeletes; protected $table = 'tours'; public static $snakeAttributes = false; @@ -41,8 +46,9 @@ class Tour extends Model 'origin_city_id' => 'int', 'destination_city_id' => 'int', 'file_id' => 'int', - 'tour_mode'=> 'int', - 'tour_scope' => 'int', + 'tour_mode'=> TourMode::class, + 'tour_scope' => TourScope::class, + 'tour_type' => TourType::class, 'views_count' => 'int' ]; @@ -61,18 +67,16 @@ class Tour extends Model #[Scope] protected function applySort(Builder $query, ?string $sort = null): void { + $query->withMin('tourDepartures', 'price') + ->withMax('tourDepartures', 'price'); + switch ($sort) { - case 'lowest': - $query->withMin('tourDepartures', 'price') - ->orderBy('tour_departures_min_price'); + $query->orderBy('tour_departures_min_price'); break; - case 'highest': - $query->withMax('tourDepartures', 'price') - ->orderByDesc('tour_departures_max_price'); + $query->orderByDesc('tour_departures_max_price'); break; - default: $query->orderByDesc('id'); break; @@ -106,4 +110,15 @@ class Tour extends Model { 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); + } } diff --git a/app/Models/TourImage.php b/app/Models/TourImage.php new file mode 100644 index 0000000..c5a2986 --- /dev/null +++ b/app/Models/TourImage.php @@ -0,0 +1,53 @@ + 'int', + 'file_id' => 'int', + 'sort_order' => 'int', + 'is_default' => 'bool' + ]; + + protected $fillable = [ + 'tour_id', + 'file_id', + 'sort_order', + 'is_default' + ]; + + public function tour() + { + return $this->belongsTo(Tour::class); + } + + public function file() + { + return $this->belongsTo(File::class); + } +}