分页不适用于 POST 动作 laravel 5

Posted

技术标签:

【中文标题】分页不适用于 POST 动作 laravel 5【英文标题】:Pagination doesn't work with POST action laravel 5 【发布时间】:2015-08-11 11:52:17 【问题描述】:

我在 Laravel 5 中使用分页时遇到问题。在这种情况下,我想对从搜索中获得的结果进行分页,我的代码可以工作并显示与我的搜索匹配的内容,但是当我想查看其他内容时结果(page = 2)它不显示任何内容,并且出现路由异常。

MethodNotAllowedHttpException in RouteCollection.php line 207:

分页是否仅适用于 GET 操作?

我希望能得到一些帮助。

这是我目前的代码

SearchController.php

/* Bring the form */
public function index()
    
        $levels = Level::all();
        return view('search.seek')->with('levels',$levels);
    

    /**
     * Display results that matches my search
     * @param Request $request
     * @return Response
     */
    public function results(Request $request)
    
        $suggestions = Suggestion::where('subject','=',$request->subject,'and')
                                    ->where('level','=',$request->level,'and')
                                    ->where('grade','=',$request->grade,'and')
                                    ->where('topic','=',$request->topic,'and')
                                    ->where('device','=',$request->device)->latest()->paginate(5);

        $suggestions->setPath('results');
        return view('search.list')->with('suggestions', $suggestions);
    

Route.php

    Route::post('results',[
        'as' => 'results_path',
        'uses' => 'SearchController@results' ]);

list.blade.php

@if($suggestions != null)
        <h1 class="page-heading">Resultados</h1>
        @foreach($suggestions->chunk(5) as $Suggestions)
        <div class="row">
            <div class="col-lg-12">
                    @foreach($Suggestions as $suggestion)
                        <div id="postlist">
                            <div class="panel">
                                <div class="panel-heading">
                                    <div class="text-center">
                                        <div class="row">
                                            <div class="col-sm-9">
                                                <h3 class="pull-left">!! \App\Topic::find($suggestion->topic)->name !!</h3>
                                            </div>
                                            <div class="col-sm-3">
                                                <h4 class="pull-right">
                                                    <small><em>!! $suggestion->created_at->format('Y-m-d') !!</em></small>
                                                </h4>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel-body">!! $suggestion->how_to_use !!</div>
                                <div class="panel-footer"><span class="label label-default">Por: !! \App\User::find($suggestion->user_id)->name !!</span><span class="label label-success pull-right">!! link_to('results/' .$suggestion->id ,'Ver',null) !!</span></div>
                            </div>
                        </div>
                    @endforeach
            </div>
        </div>
        @endforeach
        !! $suggestions->render() !!
    @endif

【问题讨论】:

【参考方案1】:

是的,分页只适用于获取参数。

您应该为您的搜索页面使用GET 方法。 POST 请求不是为了显示数据。为什么?原因有很多,但简而言之,我举两个例子:

    使用GET 参数,假设您在第六页 - 您可以复制链接并将其粘贴给朋友,他将能够查看与您相同的内容。对于POST,这是不可能的。

    如果您设法使分页正常工作,则不能在 POST 请求中使用后退按钮。

POST 请求在您需要向服务器提交数据以创建新记录时很有用。

所以我建议你把你的路由类型改为GET,你的搜索表单方法改为GET

【讨论】:

谢谢哥们,你的解释对我很有用,我已经改成GET resquest了,可以了,但是它只检索前5条记录,我仍然看不到其他的,它使用分页按钮时什么都不显示,我会继续检查 你也说服我改用 get 搜索而不是 post,谢谢 @AngelSalazar,当您使用分页按钮时,您的查询字符串是否得到维护?为分页链接尝试 $suggestions->appends(Request::except('page'))->links() 也有问题,GET请求参数。其中最大的是,作为查询字符串传递的数字被转换为字符串。在 POST 请求正文中传递参数时不会发生这种情况。【参考方案2】:

真的,您可以将表单与 POST 方法一起使用。分页链接是 GET 请求,但这是自动的,您可以将路由定义与多个方法一起使用,并且功能将是自动的。

你的 route.php 这样的东西应该可以工作。

Route::match(['get', 'post'], 'results',[
        'as' => 'results_path',
        'uses' => 'SearchController@results' ]);

【讨论】:

不错的一个。即使在 Laravel 6 中也可以使用。您还必须注意在视图中添加以下内容 $data->appends(Request::all())->links()【参考方案3】:
DB::table($table)->paginate($perPage,['*'],'page',$page);

在帖子中使用它的 gonaa 工作

【讨论】:

Ty 答案(文档中未提及的内容)。第二个参数指的是什么? 请提供有关此方法的足够信息,并附上参数说明。 这里有关此方法的信息:laravel.com/api/7.x/Illuminate/Database/Eloquent/…【参考方案4】:

这是完整的答案

Web.php
    Route::get('/faq', 'MainController@faq')->name('faq');
    
    Route::any('/faq-search', 'MainController@faqSearch')->name('faqSearch');

控制器

      public function faq()
    
        $faqs = Faq::paginate(5);

        return view('guest.faq', compact('faqs'));
    

    public function faqSearch(Request $request)
    
        $faqSearch = $request->get('faqSearch');

        $faqs = Faq::where('en_question', 'like', $faqSearch.'%')->paginate(5)->setPath('');

        $pagination = $faqs->appends(array(
          'faqSearch' => $faqSearch
        ));

        return view('guest.faq', compact('faqs', 'faqSearch'));
    

视图(刀片)

          <form action="route('faqSearch')" method="post">
            @csrf

              <div class="input-group flex-nowrap">
                  <div class="input-group-prepend">
                      <button class="btn btn-primary input-group-text" type="submit">
                          <i class="fa fa-search"></i>
                      </button>
                  </div>
                  <input type="text" name="faqSearch" class="form-control" placeholder="Search" aria-label="Search" aria-describedby="addon-wrapping" value=" old('faqSearch', $faqSearch ?? '') " >
              </div>
          </form>

            <div class="col-md-3 mx-auto">
               $faqs->links() 
          </div>

非常感谢“Avinash Nethala”的博客

资源

https://medium.com/justlaravel/paginated-data-with-search-functionality-in-laravel-ee0b1668b687 https://laravel.com/docs/5.3/pagination

【讨论】:

【参考方案5】:

解决方案是使用 JS 或 jquery 来返回视图中控制器的所有数据。

【讨论】:

以上是关于分页不适用于 POST 动作 laravel 5的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 分页不适用于数组而不是集合

Laravel Cors 中间件不适用于 POST 请求

Laravel Eloquent / keyBy不适用于相关实体

Laravel MIME 验证不适用于 .doc 文件

e.preventDefault 不适用于 laravel 5.7

分页 Laravel 集合