所以我使用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'))
我的问题是我不知道如何做到这一点,而不写意大利面代码。(如果是所有情况,我会有)
编辑:我认为这可以工作,但它没有得到正确的日期从DB:
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()
。
我让它在我的事件控制器中使用以下代码:
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])
也许有一个更好的解决方案,但这应该工作得很好?