Laravel: 过滤数据后重定向到同一路由
Laravel: Redirecting to same route after filtering data
我有一个索引页面,其中列出了我拥有的所有数据,还有一个简单的过滤表单,可以向其给定路由
发出POST
请求
@section('content')
<h4>Maçlar</h4>
<form class="form-inline" method="post" action="{{ route('games.filter') }}">
{{ csrf_field() }}
<div class="form-group mb-2">
<label class="sr-only">Email</label>
<select class="form-control" id="season-select" name="season">
<option value="0">Tüm Sezonlar</option>
@foreach ($seasons as $season)
<option value="{{$season->id}}" {{old('season') == $season->id ? 'selected' : ''}}>{{$season->season}}</option>
@endforeach
</select>
</div>
<div class="form-group mx-sm-3 mb-2">
<label for="week-select" class="sr-only">Password</label>
<select class="form-control" id="week-select" name="week">
<option value="0">Tüm Haftalar</option>
@foreach ($weeks as $week)
<option value="{{$week->id}}" {{old('week') == $week->id ? 'selected' : ''}}>{{$week->week}}</option>
@endforeach
</select>
</div>
<button type="submit" class="btn btn-primary mb-2">Filtrele</button>
</form>
<table class="table table-striped">
<thead>
<tr>
<th scope="col">Sezon</th>
<th scope="col">Hafta</th>
<th scope="col">Ev Sahibi Takım</th>
<th scope="col">Misafir Takım</th>
<th scope="col">Tarih ve Saat</th>
<th scope="col">Yer</th>
</tr>
</thead>
<tbody>
@foreach ($games as $game)
<tr>
<td>{{$game->season->season}}</td>
<td>{{$game->week->week}}</td>
<td>{{@$game->homeTeam->name}}</td>
<td>{{@$game->awayTeam->name}}</td>
<td>{{@$game->game_date_time}}</td>
<td>{{@$game->place}}</td>
</tr>
@endforeach
</tbody>
</table>
@endsection
在控制器中我的索引方法如下
public function index()
{
$seasons = Season::all();
$weeks = Week::all();
$games = Game::with('season', 'week', 'homeTeam', 'awayTeam')->get();
return view('game.index')->with(compact('games', 'seasons', 'weeks'));
}
还有我的过滤方法,它执行 POST
请求并将过滤后的数据传递到与索引使用相同的视图。
public function filter(Request $request)
{
$seasons = Season::all();
$weeks = Week::all();
$games = Game::with('season', 'week', 'homeTeam', 'awayTeam')
->when(request('season') != 0, function ($q) {
return $q->where('season_id', request('season'));
})->when(request('week') != 0, function ($q) {
return $q->where('week_id', request('week'));
})
->get();
return view('game.index')->with(compact('games', 'seasons', 'weeks'));
}
我想了解的是,实现这种情况的最佳方式是什么?是否可以在执行 POST
过滤请求后重定向回相同的索引路由? old
方法在 blade 模板中不起作用,因此我无法在请求后显示旧表单数据。它可能有什么问题?最后,如何删除索引和筛选方法中的这些重复行。
$seasons = Season::all();
$weeks = Week::all();
如有任何帮助,我们将不胜感激。 PS:我不想使用 Ajax、Vue.js 等。我想使用 Laravel。
您也可以在索引方法中使用过滤器。无需为过滤器创建其他方法。
观点改变。
<form class="form-inline" method="post" action="{{ route('games.index') }}"> // form redirect to index method
索引方法发生变化。
public function index(Request $request)
{
$seasons = Season::all();
$weeks = Week::all();
if($request->has('season') && $request->has('week') ){ // check filter value is passed or not
$games = Game::with('season', 'week', 'homeTeam', 'awayTeam')
->when(request('season') != 0, function ($q) {
return $q->where('season_id', request('season'));
})->when(request('week') != 0, function ($q) {
return $q->where('week_id', request('week'));
})
->get();
}
else{
$games = Game::with('season', 'week', 'homeTeam', 'awayTeam')->get();
}
return view('game.index')->with(compact('games', 'seasons', 'weeks'));
}
我有一个索引页面,其中列出了我拥有的所有数据,还有一个简单的过滤表单,可以向其给定路由
发出POST
请求
@section('content')
<h4>Maçlar</h4>
<form class="form-inline" method="post" action="{{ route('games.filter') }}">
{{ csrf_field() }}
<div class="form-group mb-2">
<label class="sr-only">Email</label>
<select class="form-control" id="season-select" name="season">
<option value="0">Tüm Sezonlar</option>
@foreach ($seasons as $season)
<option value="{{$season->id}}" {{old('season') == $season->id ? 'selected' : ''}}>{{$season->season}}</option>
@endforeach
</select>
</div>
<div class="form-group mx-sm-3 mb-2">
<label for="week-select" class="sr-only">Password</label>
<select class="form-control" id="week-select" name="week">
<option value="0">Tüm Haftalar</option>
@foreach ($weeks as $week)
<option value="{{$week->id}}" {{old('week') == $week->id ? 'selected' : ''}}>{{$week->week}}</option>
@endforeach
</select>
</div>
<button type="submit" class="btn btn-primary mb-2">Filtrele</button>
</form>
<table class="table table-striped">
<thead>
<tr>
<th scope="col">Sezon</th>
<th scope="col">Hafta</th>
<th scope="col">Ev Sahibi Takım</th>
<th scope="col">Misafir Takım</th>
<th scope="col">Tarih ve Saat</th>
<th scope="col">Yer</th>
</tr>
</thead>
<tbody>
@foreach ($games as $game)
<tr>
<td>{{$game->season->season}}</td>
<td>{{$game->week->week}}</td>
<td>{{@$game->homeTeam->name}}</td>
<td>{{@$game->awayTeam->name}}</td>
<td>{{@$game->game_date_time}}</td>
<td>{{@$game->place}}</td>
</tr>
@endforeach
</tbody>
</table>
@endsection
在控制器中我的索引方法如下
public function index()
{
$seasons = Season::all();
$weeks = Week::all();
$games = Game::with('season', 'week', 'homeTeam', 'awayTeam')->get();
return view('game.index')->with(compact('games', 'seasons', 'weeks'));
}
还有我的过滤方法,它执行 POST
请求并将过滤后的数据传递到与索引使用相同的视图。
public function filter(Request $request)
{
$seasons = Season::all();
$weeks = Week::all();
$games = Game::with('season', 'week', 'homeTeam', 'awayTeam')
->when(request('season') != 0, function ($q) {
return $q->where('season_id', request('season'));
})->when(request('week') != 0, function ($q) {
return $q->where('week_id', request('week'));
})
->get();
return view('game.index')->with(compact('games', 'seasons', 'weeks'));
}
我想了解的是,实现这种情况的最佳方式是什么?是否可以在执行 POST
过滤请求后重定向回相同的索引路由? old
方法在 blade 模板中不起作用,因此我无法在请求后显示旧表单数据。它可能有什么问题?最后,如何删除索引和筛选方法中的这些重复行。
$seasons = Season::all();
$weeks = Week::all();
如有任何帮助,我们将不胜感激。 PS:我不想使用 Ajax、Vue.js 等。我想使用 Laravel。
您也可以在索引方法中使用过滤器。无需为过滤器创建其他方法。
观点改变。
<form class="form-inline" method="post" action="{{ route('games.index') }}"> // form redirect to index method
索引方法发生变化。
public function index(Request $request)
{
$seasons = Season::all();
$weeks = Week::all();
if($request->has('season') && $request->has('week') ){ // check filter value is passed or not
$games = Game::with('season', 'week', 'homeTeam', 'awayTeam')
->when(request('season') != 0, function ($q) {
return $q->where('season_id', request('season'));
})->when(request('week') != 0, function ($q) {
return $q->where('week_id', request('week'));
})
->get();
}
else{
$games = Game::with('season', 'week', 'homeTeam', 'awayTeam')->get();
}
return view('game.index')->with(compact('games', 'seasons', 'weeks'));
}