【问题标题】:Laravel: pagination on search method not updating the urlLaravel:搜索方法的分页不更新网址
【发布时间】:2020-09-19 07:31:19
【问题描述】:

我目前正在做一个项目,其中一页显示数据库中当前的所有项目,我使用 laravel 的分页。这工作得很好。但该页面还具有搜索特定项目的搜索功能。这就是我遇到问题的地方。

目前,搜索后第一页显示正常,但是当我按下按钮转到任何其他页面时,我总是得到第一页(页面刷新但 url 没有改变,我得到第 1 页)。如果我手动将 url 更改为链接上的 href 它可以工作,但按下按钮不会更改 url。页码未附加。

这是我的控制器

public function searchItems(Request $request)
  {
    if (!Auth::check() || !Auth::user()->is_admin()) return redirect('/login');

    $request->validate([

      'admin-query' => 'required|min:3',

    ]);

    $query = $request->input('admin-query');

    $items_aux = DB::select("SELECT id, ts_rank_cd(textsearch, query) AS rank FROM \"item\", to_tsquery('english','.$query') 
      AS query, to_tsvector(name || ' ' || description) AS textsearch WHERE query @@ textsearch ORDER BY rank DESC");

    $ids = array();
    for ($i = 0; $i < sizeof($items_aux); $i++) {
      $ids[$i] = $items_aux[$i]->id;
    }

    $categories = Category::orderBy('id', 'DESC')->get();

    $items = Item::whereIn('id', $ids)->orderBy('id', 'DESC')->paginate(10);
    $pagination = $items->appends(array(
      'adim-query' => Input::get('admin-query')
    ));

    foreach ($items as $item) {

      $img_url = Product_Image::where('id_item', '=', $item->id)->first()['url'];
      if (Storage::disk('public')->exists($img_url)) {
        $item->img = Storage::url($img_url);
      } else {
        $item->img = null;
      }
    }

    return view('pages.adminproducts', ['items' => $items, 'categories'=>$categories]);
  }

我的路线:

Route::get('admin-items/search', 'AdminItemsController@searchItems');

我的表格:

<div class="form col-sm-8 col-md-8 col-lg-4 text-center pt-0">
            <!--form-->
            <form action="/admin-items/search" method="GET" class="header-search-form" role="search">

            <input type="text" name="admin-query" id="admin-query" value="{{ request()->input('admin-query') }}" class="search-box" 
                placeholder="Search Products">
                <button><i class="fa fa-search" aria-hidden="true"></i>
                </button>
            </form>
        </div>

我的项目和链接:

<div class="row">
            <div class="management-products container-fluid card-deck justify-content-center">

                @foreach($items as $item)
                @include('partials.admin_product', $item)
                @endforeach
            </div>
        </div>
        <div class="row justify-content-center">
            <div class="pagination-links">
                {{ $items->links() }}
            </div>
        </div>
    </div>

检查加载页面上的链接

<li class="page-item disabled" aria-disabled="true" aria-label="« Previous">
<span class="page-link" aria-hidden="true">‹</span>
</li>
<li class="page-item active" aria-current="page"><span class="page-link">1</span></li>
<li class="page-item"><a class="page-link" href="http://localhost:8000/admin-items/search?adim-query=volutpat&amp;page=2">2</a></li>
 <li class="page-item"><a class="page-link" href="http://localhost:8000/admin-items/search?adim-query=volutpat&amp;page=3">3</a></li>
<li class="page-item"><a class="page-link" href="http://localhost:8000/admin-items/search?adim-query=volutpat&amp;page=4">4</a></li>
<li class="page-item"><a class="page-link" href="http://localhost:8000/admin-items/search?adim-query=volutpat&amp;page=5">5</a></li>
<li class="page-item"><a class="page-link" href="http://localhost:8000/admin-items/search?adim-query=volutpat&amp;page=6">6</a></li>
<li class="page-item"><a class="page-link" href="http://localhost:8000/admin-items/search?adim-query=volutpat&amp;page=2" rel="next" aria-label="Next »">›</a></li>

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    你必须在你的视图中做一点改变。如果这不起作用,请告诉我,必须给你另一个解决方案

    <div class="row">
            <div class="management-products container-fluid card-deck justify-content-center">
    
                @foreach($items as $item)
                @include('partials.admin_product', $item)
                @endforeach
            </div>
        </div>
        <div class="row justify-content-center">
            <div class="pagination-links">
                {{ $items->appends(request()->except('page'))->links() }}
                //This is important
            </div>
        </div>
    </div>
    

    或者您也可以按照您的代码进行操作,但只需稍作改动

    $items = Item::whereIn('id', $ids)->orderBy('id', 'DESC')->paginate(10);
    $items = $items->appends(request()->except('page'));
    

    【讨论】:

    • 感谢您的帮助。但是,如果你不介意,你能解释一下为什么会这样吗?在我看来,您添加的内容与 ` $pagination = $items->appends(array( 'adim-query' => Input::get('admin-query') )); 行相同` 我不明白为什么不是。
    • 您还在控制器中使用了 append 方法,但您没有正确地将其传递给视图。我为您编写的代码是一种快捷方式。这仅意味着更改 url 中除页面之外的任何内容。所以它会留在原地。
    • 使用我的代码,您不再需要这部分代码$pagination = $items-&gt;appends(array('adim-query' =&gt; Input::get('admin-query'))); 在您的控制器内
    • 既然我将它附加到 $items 然后执行return view('pages.adminproducts', ['items' =&gt; $items, 'categories'=&gt;$categories]); 不会将它传递给视图吗?
    • 最后一个代码不起作用,它会回到我最初描述的方式。但是这样:$items = $items-&gt;appends(request()-&gt;except('page')); 它可以工作。我猜只是传递输入是不够的,它需要整个请求???
    猜你喜欢
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 2019-01-03
    • 2011-06-20
    • 2019-07-04
    • 2016-12-31
    相关资源
    最近更新 更多