Метод withQueryString
Метод withQueryString применяется к экземпляру LengthAwarePaginator и возвращает тот же объект пагинатора, дополненный параметрами текущего запроса. При вызове метода все параметры из строки запроса (query string) автоматически добавляются к URL-адресам страниц пагинации. Метод не принимает никаких параметров и работает как с GET-параметрами, так и с параметрами маршрута. Это особенно полезно при фильтрации данных, когда нужно сохранить выбранные пользователем критерии поиска.
Синтаксис
<?php
$paginator->withQueryString();
?>
Пример использования в контроллере
Рассмотрим типичный пример использования метода withQueryString в контроллере для сохранения параметров фильтрации при пагинации:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use Illuminate\Http\Request;
class ArticleController extends Controller
{
public function index(Request $request)
{
$query = Article::query();
if ($request->has('search')) {
$query->where('string', 'like', '%' . $request->search . '%');
}
if ($request->has('category')) {
$query->where('category', $request->category);
}
$articles = $query->paginate(10)->withQueryString();
return view('articles.index', ['articles' => $articles]);
}
}
?>
Пример отображения ссылок в Blade
В шаблоне Blade для отображения ссылок пагинации используется метод links. Все параметры запроса будут автоматически добавлены к каждой ссылке:
<form method="GET" action="/articles">
<input type="text" name="search" placeholder="Search articles">
<select name="category">
<option value="">All categories</option>
<option value="tech">Technology</option>
<option value="science">Science</option>
</select>
<button type="submit">Search</button>
</form>
@foreach ($articles as $article)
<div>
<h3>{{ $article->title }}</h3>
<p>{{ $article->description }}</p>
</div>
@endforeach
{{ $articles->links() }}
Результат работы
После применения метода withQueryString ссылки пагинации будут содержать все параметры запроса. Например, при переходе на вторую страницу URL будет выглядеть так:
https://example.com/articles?search=laravel&category=tech&page=2
Пример с несколькими параметрами
Метод withQueryString сохраняет все параметры, включая сортировку и фильтры. Рассмотрим более сложный пример:
<?php
namespace App\Http\Controllers;
use App\Models\Product;
use Illuminate\Http\Request;
class ProductController extends Controller
{
public function index(Request $request)
{
$query = Product::query();
if ($request->has('min_price')) {
$query->where('price', '>=', $request->min_price);
}
if ($request->has('max_price')) {
$query->where('price', '<=', $request->max_price);
}
if ($request->has('sort')) {
$query->orderBy($request->sort, $request->get('direction', 'asc'));
}
$products = $query->paginate(15)->withQueryString();
return view('products.index', ['products' => $products]);
}
}
?>
Пример комбинирования с другими методами
Метод withQueryString можно комбинировать с другими методами пагинатора, такими как fragment и appends:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index(Request $request)
{
$users = User::where('status', 'active')
->paginate(20)
->withQueryString()
->fragment('users-list')
->appends(['filter' => 'active']);
return view('users.index', ['users' => $users]);
}
}
?>
Результат комбинированного примера
В результате все ссылки пагинации будут содержать параметры запроса, якорь и дополнительные параметры:
"/users?page=2&filter=active#users-list"
"/users?page=3&filter=active#users-list"