我正在使用Laravel PHP应用程序,在主页上,用户选择特定类别,并在用户进行选择后返回结果。现在正在正确地返回结果,除了一个问题,如果有多页结果。
例如,假设我有15条属于' category1'的记录。现在我设置了分页,每页显示10个结果。因此,这15条记录应显示如下,第1页包含10条记录,第2页包含5条记录。然而,我遇到的问题是,第1页显示所选类别的前10条记录,但在选择第2页时,它会显示所有其他记录,而不仅仅是剩下的5条记录属于'类别1'
控制器:
<!-- Form -->
{{Form::model(array('method' => 'GET', 'route' => 'overview_select', 'files' => true)) }}
<div class="form-group">
{{ Form::label('category', 'Category:') }}
{{ Form::select('category', array('category1' => 'Category1', 'category2' => 'Category2', 'category3' => 'Category3', 'category4' => 'Category4'), (isset($category) ? $category : 'category')) }}
<div class="form-group">
{{ Form::submit('Select Category', array('class' => 'btn btn-primary')) }}
</div>
{{ Form::close() }}
</div>
public function index()
{
$vdo = Video::query();
$pic = Picture::query();
if($category = Input::get('category')){
$vdo->where('category', $category);
$pic->where('category', $category);
}
$allvids = $vdo->paginate(10);
$allpics = $pic->paginate(10);
$data = compact('allvids','allpics');
$data['category'] = Input::get('category');
$this->layout->content = \View::make('home.pics_vids_overview',$data);
}
查看:
<div class="panel-body">
@if ($allvids->count())
<dl class="dl-horizontal">
<!-- Add this div class to make the table responsive -->
<div class = "table-responsive">
<table class="table">
<b>Results: </b>{{ $allvids->count() }}<br>
<tr>
<th>ID</th>
<th>Name</th>
<th>Description</th>
<th>Corner</th>
<th>Rock</th>
<th>Category</th>
<th>Project</th>
<th>Update Video</th>
</tr>
@foreach($allvids as $video)
<tr>
<td>{{ $video->video_id }}</b></td>
<td>{{ $video->video_name }}</td>
<td>{{ $video->video_description }}</td>
<td>{{ $video->video_corners }} </td>
<td>{{ $video->video_rocks }}</td>
<td>{{ $video->category }}</td>
<td>{{ $video->video_project }}</td>
<td><b>{{ link_to_route("show_video", 'Edit', array($video->video_id)) }}</b></td>
</tr>
@endforeach
{{ $allvids-> links()}}
</table>
</div>
</dl>
@else
<b>{{ 'No Videos in this category.' }}</b>
@endif
</div>
routes.php文件
Route::post('pics_vids', array('as'=>'overview_select', 'uses' => 'OverviewController@index'));
Route::get('pics_vids', array('as'=>'overview', 'uses' => 'OverviewController@index'));
我不太确定是否需要在控制器中附加任何内容,以便其他页面只显示所选类别的结果。非常感谢任何帮助!
答案 0 :(得分:1)
我认为问题在于您根据类别检索分页的过程。最好使用GET方法来检索列表结果,因为在用户点击按钮时,在某些浏览器中使用POST方法进行分页列表可能会抛出表单重新提交警告。
现在,你获得第2页所有产品的原因是
if($category = Input::get('category')){
$vdo->where('category', $category);
$pic->where('category', $category);
}
此处,当单击第二个链接时,请求不再进行POST,因此 Input :: get()方法为空。更改路由,以便类别以查询字符串或URI字符串的形式作为URL的一部分形成。
编辑:
我在视图中更改了表单:
{{Form::model(array('method' => 'GET', 'route' => 'overview_select', 'files' => true)) }}
为:
{{Form::open(array('method' => 'GET', 'route' => 'overview_select', 'files' => true)) }}
现在,在用户进行选择后,“类别”字段将显示在URL中。
在视图中,我更改了
{{ $allvids-> links()}}
为:
{{ $allvids->appends(array('category' => $category))->links()}}
现在,分页将适用于其他页面。
以下链接帮助我解决了我的解决方案,同时也很好地解释了GET / POST方法如何在Laravel 4的表单中工作。
Pagination in Laravel 4 works for one page, but not working for another