Spaces:
Sleeping
Sleeping
File size: 2,356 Bytes
10dc6f2 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | <?php
namespace App\Http\Controllers;
use App\Models\Category;
use App\Models\Event;
use Illuminate\Http\Request;
class EventController extends Controller
{
public function index(Request $request)
{
$query = Event::with('category', 'ticketTiers', 'organizer')->published();
// Search
if ($request->filled('q')) {
$s = $request->q;
$query->where(function ($q) use ($s) {
$q->where('title', 'like', "%{$s}%")
->orWhere('city', 'like', "%{$s}%")
->orWhere('venue_name', 'like', "%{$s}%")
->orWhere('description', 'like', "%{$s}%");
});
}
// Filter: category
if ($request->filled('category')) {
$query->where('category_id', $request->category);
}
// Filter: city
if ($request->filled('city')) {
$query->where('city', $request->city);
}
// Filter: date
if ($request->filled('date_from')) {
$query->where('start_at', '>=', $request->date_from);
}
if ($request->filled('date_to')) {
$query->where('start_at', '<=', $request->date_to . ' 23:59:59');
}
// Filter: free only
if ($request->boolean('free')) {
$query->whereHas('ticketTiers', fn($q) => $q->where('price', 0));
}
// Sort
$sort = $request->input('sort', 'date');
$query = match ($sort) {
'popular' => $query->withCount(['orders' => fn($q) => $q->where('status', 'paid')])->orderByDesc('orders_count'),
'price' => $query->orderByRaw('(SELECT MIN(price) FROM ticket_tiers WHERE event_id = events.id)'),
default => $query->orderBy('start_at'),
};
$events = $query->paginate(12)->withQueryString();
$categories = Category::orderBy('name')->get();
$cities = Event::published()->whereNotNull('city')->distinct()->pluck('city');
return view('events.index', compact('events', 'categories', 'cities'));
}
public function show(string $slug)
{
$event = Event::where('slug', $slug)
->published()
->with(['category', 'organizer', 'ticketTiers'])
->firstOrFail();
return view('events.show', compact('event'));
}
}
|