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

我的问题是我不知道如何做到这一点,而不写意大利面代码。(如果是所有情况,我会有)

编辑:我认为这可以工作,但它没有得到正确的日期从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])

也许有一个更好的解决方案,但这应该工作得很好?

最新更新