【问题标题】:Pagination after search only works on the first page搜索后的分页仅适用于第一页
【发布时间】:2023-03-31 16:12:01
【问题描述】:

第一页将被正确排序。但是,第二页(以及更远的页面)将恢复为好像根本没有填写搜索中的字段一样。

我正在收集以下表单中的搜索字段:

{{ Form::open(['route' => 'admin.users.search', 'method' => 'get', 'class' => 'navbar-form navbar-left form-inline', 'role' => 'search']) }}

<div class="form-group">
    {{ Form::text('user_id', request('user_id'), ['class' => 'form-control', 'size' => '8', 'placeholder' => 'ID']) }}
</div>


<div class="form-group">
    {{ Form::email('email', request('email'), ['class' => 'form-control', 'size' => '20', 'placeholder' => 'Email']) }}
</div>

<div class="form-group">
    {{ Form::text('first_name', request('first_name'), ['class' => 'form-control', 'size' => '20', 'placeholder' => 'First Name']) }}
</div>

<div class="form-group">
    {{ Form::text('family_name', request('family_name'), ['class' => 'form-control', 'size' => '20', 'placeholder' => 'Family Name']) }}
</div>

<div class="form-group">
    <div class="selectize-lg">
        {{ Form::select('institution_id', $institutions, request('institution_id'), ['class' => 'form-control', 'size' => '200', 'data-selectize']) }}
    </div>
</div>

<div class="form-group">
    <div class="selectize-lg">
        {{ Form::select('exam_id', $exams, request('exam_id'), ['class' => 'form-control', 'data-selectize']) }}
    </div>
</div>

<div class="form-group  ">
    {{ Form::submit('Search', ['class' => 'btn btn-default']) }}
</div>

<a href="{{ route('admin.users.index') }}" class="btn btn-warning">Clear</a>

{{ Form::close() }}

一旦表单被提交,它将到达一个 GET 路径

Route::get('members/search', 'UsersController@search')->name('admin.users.search');

然后是用户控制器:

 $users = User::with('exam', 'institution');


    if ($request->has('user_id')) {
        $users->whereId($request->user_id);
    }

    if ($request->has('email')) {
        $users->whereEmail($request->email);
    }

    if ($request->has('first_name')) {
        $users->where('first_name', 'LIKE', "%{$request->first_name}%");
    }

    if ($request->has('family_name')) {
        $users->where('family_name', 'LIKE', "%{$request->family_name}%");
    }

    if ($request->has('institution_id')) {
        $users->whereInstitutionId($request->institution_id);
    }

    if ($request->has('exam_id')) {
        $users->whereExamId($request->exam_id);
    }

    $users = $users->latest()->paginate(48);
    $usersTotal = $users->total();

    $exams = ['' => 'Exam...'] + Exam::orderBy('title')
        ->pluck('title', 'id')
        ->all();

    $institutions = ['' => 'University...'] + Institution::orderBy('name')
        ->pluck('name', 'id')
        ->all();

    return view('admin.users.index', compact('users', 'usersTotal', 'exams', 'institutions'));

然后,在视图中我添加这样的分页链接:

{{ $users->appends(array_filter(request()->except('page')))->render() }}

但是,搜索结果仅适用于首页。例如,第一页上的路线如下所示:

search?user_id=&email=hello%40world&first_name=John&family_name=Smith&institution_id=1&exam_id=1

但是第二页会是这样的:

search?page=2

我发现这很令人费解,不太确定是什么导致第二页上的搜索失败。

【问题讨论】:

  • 您是否在包含分页按钮的表单中包含所有搜索参数(作为隐藏输入)?

标签: php laravel laravel-5 pagination laravel-5.3


【解决方案1】:

From the docs:

附加到分页链接

您可以使用 附加方法。例如,将 sort=votes 附加到每个分页 链接,您应该对 appends 进行以下调用:

{{ $users-&gt;appends(['sort' =&gt; 'votes'])-&gt;links() }} 如果你愿意 将“哈希片段”附加到分页器的 URL,您可以使用 片段法。例如,将#foo 附加到每个文件的末尾 分页链接,对fragment方法进行如下调用:

{{ $users-&gt;fragment('foo')-&gt;links() }}

你几乎走在了正确的轨道上:

{{ $users->appends(array_filter(request()->except('page')))->render() }}

当您切换页面时,这种代码的和平所做的就是继承页面请求,这是必要的,因为这是为您完成的。因此,您需要指定要保留的请求数据。比如:

{{ $users->appends(Request::except('page'))->links() }}

会将所有请求数据添加到下一页,但分页链接除外,因为这是默认添加的。

注意:我注意到您正在发送带有 GET 请求的 id,请小心这样做。不怀好意的用户可以看到您的数据库结构并可能利用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    相关资源
    最近更新 更多