Laravel PHP:附加分页页面结果未被正确检索

时间:2014-11-18 21:12:15

标签: php laravel-4

我正在使用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'));

我不太确定是否需要在控制器中附加任何内容,以便其他页面只显示所选类别的结果。非常感谢任何帮助!

1 个答案:

答案 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