События фильтрации запросов Laravel DB на основе выбранных параметров в <select>

Итак, я использую Laravel и хочу фильтровать события на основе пользовательского ввода в поле фильтра:

Это лезвие коробки фильтра:

Request::is

устанавливает значение по умолчанию на этих страницах. Таким образом, $category = 0 будут все события и $category = 1 только события.

<?php

if (Request::is('all-events')) {
    $category = '0';    
    $timeframe = '0';

} else if (Request::is('events')) {
    $category = '1';    
    $timeframe = '0';
}


if (request()->get('category')) {
    $requestCategory = request()->get('category');    

if (in_array((int)$requestCategory, range(0, 8))) {
        $category = $requestCategory;    
}
}


if (request()->get('timeframe')) {
    $requestTimeframe = request()->get('timeframe');        
    $timeframe = $requestTimeframe;
}

?>

<form class = "container @if (Request::is('events')) -mt-24 @endif !pb-0">
    <div class = "pt-6 md:pt-0">        
        <div class = "bg-white p-6 rounded-lg">            
            <div class = "grid grid-cols-1 md:grid-cols-2 gap-6">                
                <div>                    
                    <label class = "mb-3 inline-block">Timeframe:</label>
                    <select aria-label = "Category" name = "timeframe" class = "w-full bg-dark-gray p-3 rounded-lg">                        
                    <option value = "0" @if ($timeframe === '0') selected @endif>Upcoming</option>                        
                    <option value = "1" @if ($timeframe === '1') selected @endif>Today</option>                        
                    <option value = "2" @if ($timeframe === '2') selected @endif>Tomorrow</option>                        
                    <option value = "3" @if ($timeframe === '3') selected @endif>This Week</option>                        
                    <option value = "4" @if ($timeframe === '4') selected @endif>Next Week</option>                        
                    <option value = "5" @if ($timeframe === '5') selected @endif>Next Month</option>                    
                </select>                
            </div>               
         <div>                    
            <label class = "mb-3 inline-block">Kategorie</label>                    
            <select aria-label = "Kategorie" name = "category" class = "w-full bg-dark-gray p-3 rounded-lg">                        
                <option value = "0" @if ($category === '0') selected @endif>Alle Events</option>                        
                <option value = "1" @if ($category === '1') selected @endif>Events and similar</option>                        
                <option value = "2" @if ($category === '2') selected @endif>Lorem Impsum</option>                        
                <option value = "3" @if ($category === '3') selected @endif>Lorem Impsum</option>                        
                <option value = "4" @if ($category === '4') selected @endif>Lorem Impsum</option>                        
                <option value = "5" @if ($category === '5') selected @endif>Lorem Impsum</option>                        
                <option value = "6" @if ($category === '6') selected @endif>Lorem Impsum</option>                        
                <option value = "7" @if ($category === '7') selected @endif>Lorem Impsum</option>                        
                <option value = "8" @if ($category === '8') selected @endif>Lorem Impsum</option>                   
             </select>
          </div>
      </div>            
      <div class = "mt-3 flex items-end">
            <x-button type = "submit" class = "w-full">Suchen</x-button>
    </div>        
   </div>    
  </div>
</form>

Это контроллер событий:

public function eventsList(Request $request)
{
    {
        if (empty($request->query()) || $request->query('category') === '1') {
            return view('pages.course.event-list', [
                'events' => Events::query()
                    ->where('category', '1')
                    ->where('start', '>', now())
                    // add pagination                    
                    ->paginate(15)

            ]);        
         }

        if ($request->query('category') === '0') {
            return view('pages.course.event-list', [
                'events' => Events::query()
                    ->where('start', '>', now())
                    // add pagination                    
                    ->paginate(15)

            ]);       
         }

        return view('pages.course.event-list', [
            'events' => Events::query()
                ->where('category', $request->query('category'))
                ->where('start', '>', now())
                // add pagination                
             ->paginate(15)

        ]);    
}


}

Так что я мог бы сделать то же самое, что и с

$request->query('category'))

Но, как

$request->query('timeframe'))

У меня проблема в том, что я понятия не имею, как это сделать без написания спагетти-кода. (Если бы чехлы на все случаи у меня были бы)

Редактировать: Я думаю, что это может сработать, но не получает правильных дат из БД:

if ($request->get('timeframe')) {
    $date = match ($request->get('timeframe')) {
        '0' => Carbon::now(),
        '1' => Carbon::today(),
        '2' => Carbon::tomorrow(),
        '3' => Carbon::now()->endOfWeek(),
        '4' => Carbon::now()->next(Carbon::MONDAY),
        '5' => Carbon::now()->startOfMonth()->addMonth()->endOfMonth(),
    };
} else {
    $date = now();
}

тогда он будет использовать $date вместо now() в построителе запросов.

взгляните на этот пакет https://spatie.be/docs/laravel-query-builder/v2/introduction

Mohamed Melouk 31.12.2022 11:02

@MohamedMelouk Я не думаю, что этот пакет поможет. Это возможно сделать только с углеродом. Проблема, с которой я столкнулся сейчас, заключается в том, что он неправильно захватывает/сравнивает даты в запросе. Смотрите редактирование, которое я только что сделал.

Nifty Matrix 31.12.2022 12:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я заставил его работать с этим кодом в моем контроллере событий:

if ($request->get('timeframe')) {
    $now = CarbonImmutable::now();
    [$startDate, $endDate] = match ($request->get('timeframe')) {
        '0' => [$now, Carbon::now()->startOfMonth()->addYears('999')->endOfMonth()->endOfDay()],
        '1' => [$now , Carbon::today()->endOfDay()],
        '2' => [Carbon::tomorrow()->startOfDay(), Carbon::tomorrow()->endOfDay()],
        '3' => [$now, Carbon::now()->endOfWeek()->endOfDay()],
        '4' => [$now->next(Carbon::SUNDAY)->startOfDay(), Carbon::now()->next(Carbon::SUNDAY)->endOfDay()],
        '5' => [$now->startOfMonth()->addMonth()->startOfMonth(), Carbon::now()->startOfMonth()->addMonth()->endOfMonth()->endOfDay()],
    };
} else {
    // default if no timeframe is set as URL parameter
    $startDate = Carbon::now();
    $endDate = Carbon::now()->startOfMonth()->addYears('999')->endOfMonth()->endOfDay();
}

а затем в URL-запросе:

->whereBetween('start', [$startDate, $endDate])

Может быть, есть лучшее решение для этого, но это должно работать нормально?

Другие вопросы по теме