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'));
    }
}