2017-03-21 6 views
1

Die erste Seite wird korrekt sortiert. Die zweite Seite (und weiter) wird jedoch wieder so aussehen, als ob überhaupt keine Felder in der Suche gefüllt wären.Paginierung nach der Suche funktioniert nur auf der ersten Seite

Ich sammle die Suchfelder in das Formular unten ein:

{{ 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() }} 

Sobald das Formular es

Route::get('members/search', '[email protected]')->name('admin.users.search'); 

dann die Benutzer-Controller eine GET-Route treffen wird vorgelegt wurde:

$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')); 

Dann in der Ansicht füge ich die Seitenumbruch Links wie folgt hinzu:

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

Die Suchergebnisse funktionieren jedoch nur auf der ersten Seite. zum Beispiel wird die Route auf der ersten Seite wie folgt aussehen:

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

Aber die zweite Seite wird wie folgt aussehen:

search?page=2 

Ich finde das ziemlich verwirrend und nicht zu sicher, was verursacht, die Suche auf der zweiten Seite fehlschlagen.

+0

Fügen Sie alle Suchparameter (als versteckte Eingaben) in das Formular ein, das die Seitentasten enthält? – Amarnasan

Antwort

0

From the docs:

Um Paginierung Anfügen Weblinks

Sie auf die Query-String von Paginierung Links anhängen kann die anhängt Methode. Zum Beispiel anfügen sort = Stimmen bei jedem Paginierung Link, sollten Sie den folgenden Aufruf an Appends machen:

{{ $users->appends(['sort' => 'votes'])->links() }} Wenn Sie wünschen, ein „Hash-Fragment“, um die URLs der paginator hängen, können Sie das Fragment verwenden Methode.

{{ $users->fragment('foo')->links() }}

Sie sind fast auf dem richtigen Weg mit diesem:: Zum Beispiel, #foo bis zum Ende eines jeden Paginierung Link, den folgenden Aufruf an das Fragment Verfahren anhängen

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

Wat diese Frieden der Code ist über die Seite-Anfrage, wenn Sie Seiten wechseln, was notwendig ist, da dies für Sie getan wird. Sie müssen also die Anforderungsdaten angeben, die Sie behalten möchten. So zum Beispiel:

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

werden alle Anforderungsdaten auf die nächste Seite, mit Ausnahme der Paginierung Links hinzufügen, denn das wird standardmäßig hinzugefügt.

Hinweis: Ich merke, dass Sie IDs mit GET-Anfragen senden, seien Sie vorsichtig damit. Benutzer mit schlechten Absichten können Ihre Datenbankstruktur sehen und möglicherweise davon Gebrauch machen.

Verwandte Themen