Итак, я использую 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() в построителе запросов.
@MohamedMelouk Я не думаю, что этот пакет поможет. Это возможно сделать только с углеродом. Проблема, с которой я столкнулся сейчас, заключается в том, что он неправильно захватывает/сравнивает даты в запросе. Смотрите редактирование, которое я только что сделал.






Я заставил его работать с этим кодом в моем контроллере событий:
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])
Может быть, есть лучшее решение для этого, но это должно работать нормально?
взгляните на этот пакет
https://spatie.be/docs/laravel-query-builder/v2/introduction