web-dev-qa-db-fra.com

Pagination des résultats de recherche laravel 5.3

Résultats de la recherche sur la pagination

Je viens de commencer avec Laravel et j'essaie de créer une fonction de recherche avec une pagination appropriée. La fonction fonctionne pour la page un, mais pas pour la page deux. Je pense que cela ne donne pas les résultats à la page suivante mais je n'arrive pas à trouver de réponse.


c'est ma fonction de recherche dans IndexController:

public function search()
{
    $q = Input::get('search');

    # going to next page is not working yet
    $product = Product::where('naam', 'LIKE', '%' . $q . '%')
        ->orWhere('beschrijving', 'LIKE', '%' . $q . '%')
        ->paginate(6);

    return view('pages.index', compact('product'));
}

c'est mon itinéraire:

Route::post('search{page?}', 'IndexController@search');

c'est l'URL de la page deux:

/search?page=2

c'est comme ça que je montre ma pagination:

{{ $product->appends(Request::get('page'))->links()}}

l'erreur:

MethodNotAllowedHttpException in RouteCollection.php line 218:

Obtenir une erreur sur demande.

Route:

Route::get('search/{page?}', 'IndexController@search');

Erreur:

MethodNotAllowedHttpException in RouteCollection.php line 218:
in RouteCollection.php line 218
at RouteCollection->methodNotAllowed(array('GET', 'HEAD')) in RouteCollection.php line 205
at RouteCollection->getRouteForMethods(object(Request), array('GET', 'HEAD')) in RouteCollection.php line 158
at RouteCollection->match(object(Request)) in Router.php line 780
at Router->findRoute(object(Request)) in Router.php line 610
at Router->dispatchToRoute(object(Request)) in Router.php line 596
at Router->dispatch(object(Request)) in Kernel.php line 267
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 46
at CheckForMaintenanceMode->handle(object(Request), object(Closure)) in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 104
at Pipeline->then(object(Closure)) in Kernel.php line 149
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 116
at Kernel->handle(object(Request)) in index.php line 53

J'espère que ma question est claire et dans le bon format. Merci d'avance (désolé pour mon mauvais anglais)


Réponse:

J'ai fini par utiliser la réponse de ce message en combinaison avec une aide de this post

J'ai utilisé une fonction post pour la recherche initiale et une fonction get pour les pages suivantes. C'était possible parce que je donne maintenant ma recherche à l'URL.


MODIFIER:

  • ajouté l'erreur initiale.
  • a ajouté l'erreur Route::get
  • réponse ajoutée
10
Casper Spruit

Si vous souhaitez appliquer des filtres à la page suivante, vous devez les ajouter à votre paginateur comme ceci:

$product = Product::where('naam', 'LIKE', '%' . $q . '%')
        ->orWhere('beschrijving', 'LIKE', '%' . $q . '%')
        ->paginate(6);
$product->appends(['search' => $q]);

Et changez votre itinéraire de poste pour obtenir:

Route::get('search', 'IndexController@search');
20
Andrej Ludinovskov
Route::get('product', function () {
    $product= App\product::paginate(15);

    $product->setPath('custom/url');

});

Vue:

{{ $product->appends(['search' => Request::get('page')])->links() }}
3
Joci93
$searchdata =  \Request::get( 'inputTextFieldname' ); \make as global
$searchresult = Modelname::where ( 'blogpost_title', 'LIKE', '%' .$searchdata . '%' )->paginate(2);
return view( 'search', compact('searchresult') );

et dans votre page de vue 

{{$searchresult->appends(Request::only('inputTextFieldname'))->links()}}

faire votre route pour obtenir la méthode

Route::get('/search', ['as' => 'search', 'uses' => 'searchController@index']);

cela sera fait, merci,

2
Y. Joy Ch. Singha

Je suppose que vous voulez changer les pages avec des URL comme ceci search/1, search/2? Tout d’abord, votre itinéraire devrait probablement être Route::post('search/{page?}').

Je ne sais pas si seul ce changement fonctionnera, mais s'il ne fonctionne pas, vous devez résoudre une page comme celle-ci.

public function search(\Illuminate\Http\Request $request, $page = 1)
{
    $q = $request->get('search');

    \Illuminate\Pagination\Paginator::currentPageResolver(function () use ($page) {
        return $page;
    });

    # going to next page is not working yet
    $product = Product::where('naam', 'LIKE', '%' . $q . '%')
        ->orWhere('beschrijving', 'LIKE', '%' . $q . '%')
        ->paginate(6);

    return view('pages.index', compact('product'));
}
2
Skysplit

Si vous utilisez un formulaire de recherche avec la méthode GET, utilisez ce type de solution pour préserver la pagination avec les résultats de la recherche.

 public function filter(Request $request)
    {        
        $filter = $request->only('name_operator','name_value','email_operator','email_value', 'phone_operator','phone_value',   'gender_value', 'age_operator','age_value');
        $contacts = $this->repo->getFilteredList(array_filter($filter));
        $contacts->appends($filter)->links(); //Continue pagination with results
        return view('dashboard::index', compact('contacts'))->withInput($request->all());
    }
0
Amit Shah

Pour la pagination, vous devez créer un formulaire simple:

<form action="{{URL::to('/search')}}" method="post">
    <input type="hidden" name="query"/>
    <select name="pages">
    @for($p = 1; $p < $products->lastPage(); $p++ )
        <option value="{{ $p }}">{{ $p }}</option>
    @endfor
    </select>
</form>

Les méthodes de pagination sont ici:

$results->count()
$results->currentPage()
$results->firstItem()
$results->hasMorePages()
$results->lastItem()
$results->lastPage() (Not available when using simplePaginate)
$results->nextPageUrl()
$results->perPage()
$results->previousPageUrl()
$results->total() (Not available when using simplePaginate)
$results->url($page)
0
Kemal Y

dans mon cas, j'ai laravel 5.7 installé.

$perPage = $request->per_page ?? 10;

$data['items'] = User::where('name', 'like', '%'. $request->search . '%')
                         ->paginate($perPage)
                         ->appends(['search' => $request->search, 'per_page' => $request->per_page]);

    return view('users.index', $data);

et mes codes de fichiers de vue sont

pour per_page sélectionnez les menus déroulants et recherche zone

<form role="form" class="form-inline" method="get" action='{{ url('/user') }}'>
 <div class="row">
  <div class="col-sm-6">
   <div class="dataTables_length">
     <label>Show
     <select name="per_page"
       onchange="this.form.submit()"
       class="form-control input-sm">
      <option value=""></option>
      <option value="10" {{ $items->perPage() == 10 ? 'selected' : '' }}>10
      </option>
      <option value="25" {{ $items->perPage() == 25 ? 'selected' : '' }}>25
      </option>
      <option value="50" {{ $items->perPage() == 50 ? 'selected' : '' }}>50
      </option>
     </select>
     entries
     </label>
    </div>
   </div>

<div class="col-sm-6">
 <div class="dataTables_filter pull-right">
  <div class="form-group">
   <label>Search: &nbsp;
   <input type="search" name="search" class="form-control input-sm"
   placeholder="Name" value="{{ request()->search }}">
   </label>
  </div>
 </div>
</div>

 

et mon code générateur de pagination

{{ $items->appends(['search' => request()->search, 'per_page' => request()->per_page])->links() }}
0
sh6210