mirror of
https://github.com/pacnpal/thrillwiki_laravel.git
synced 2025-12-20 05:51:09 -05:00
118 lines
2.7 KiB
PHP
118 lines
2.7 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use App\Enums\RideCategory;
|
|
use App\Enums\RideStatus;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
use Illuminate\Database\Eloquent\Relations\HasOne;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class Ride extends Model
|
|
{
|
|
protected $fillable = [
|
|
'name',
|
|
'description',
|
|
'status',
|
|
'category',
|
|
'opening_date',
|
|
'closing_date',
|
|
'park_id',
|
|
'park_area_id',
|
|
'manufacturer_id',
|
|
'designer_id',
|
|
'ride_model_id',
|
|
'min_height_in',
|
|
'max_height_in',
|
|
'capacity_per_hour',
|
|
'ride_duration_seconds',
|
|
];
|
|
|
|
protected $casts = [
|
|
'status' => RideStatus::class,
|
|
'category' => RideCategory::class,
|
|
'opening_date' => 'date',
|
|
'closing_date' => 'date',
|
|
'min_height_in' => 'integer',
|
|
'max_height_in' => 'integer',
|
|
'capacity_per_hour' => 'integer',
|
|
'ride_duration_seconds' => 'integer',
|
|
];
|
|
|
|
// Base Relationships
|
|
public function park(): BelongsTo
|
|
{
|
|
return $this->belongsTo(Park::class);
|
|
}
|
|
|
|
public function parkArea(): BelongsTo
|
|
{
|
|
return $this->belongsTo(ParkArea::class);
|
|
}
|
|
|
|
public function manufacturer(): BelongsTo
|
|
{
|
|
return $this->belongsTo(Manufacturer::class);
|
|
}
|
|
|
|
public function designer(): BelongsTo
|
|
{
|
|
return $this->belongsTo(Designer::class);
|
|
}
|
|
|
|
public function rideModel(): BelongsTo
|
|
{
|
|
return $this->belongsTo(RideModel::class);
|
|
}
|
|
|
|
public function coasterStats(): HasOne
|
|
{
|
|
return $this->hasOne(RollerCoasterStats::class);
|
|
}
|
|
|
|
// Review Relationships
|
|
public function reviews(): HasMany
|
|
{
|
|
return $this->hasMany(Review::class);
|
|
}
|
|
|
|
public function approvedReviews(): HasMany
|
|
{
|
|
return $this->reviews()->approved();
|
|
}
|
|
|
|
// Review Methods
|
|
public function getAverageRatingAttribute(): ?float
|
|
{
|
|
return $this->approvedReviews()->avg('rating');
|
|
}
|
|
|
|
public function getReviewCountAttribute(): int
|
|
{
|
|
return $this->approvedReviews()->count();
|
|
}
|
|
|
|
public function canBeReviewedBy(?int $userId): bool
|
|
{
|
|
if (!$userId) {
|
|
return false;
|
|
}
|
|
|
|
return !$this->reviews()
|
|
->where('user_id', $userId)
|
|
->exists();
|
|
}
|
|
|
|
public function addReview(array $data): Review
|
|
{
|
|
return $this->reviews()->create([
|
|
'user_id' => Auth::id(),
|
|
'rating' => $data['rating'],
|
|
'title' => $data['title'] ?? null,
|
|
'content' => $data['content'],
|
|
'status' => ReviewStatus::PENDING,
|
|
]);
|
|
}
|
|
} |