Laravel Tutorials

Simplify URL Generation with Laravel's New query() Method

Published
Simplify URL Generation with Laravel's New query() Method image

Laravel introduces a more elegant approach to URL generation with query parameters through its new query() method. This dedicated API simplifies the creation of complex URLs with query strings, reducing repetitive code and potential errors.

// Generate: http://localhost/products?sort=-name
url()->query('products', ['sort' => '-name']);

The query() method takes a base path as its first argument and an array of query parameters as the second, then handles all the complexity of properly combining and encoding them into a complete URL.

// Simple key-value pairs
// http://localhost/products?sort=-name
url()->query('products', ['sort' => '-name']);
 
// Arrays as parameters (for filters, columns, etc.)
// http://localhost/products?columns[0]=name&columns[1]=price&columns[2]=quantity
url()->query('products', ['columns' => ['name', 'price', 'quantity']]);
 
// Overriding existing parameters
// http://localhost/products?sort=-price
url()->query('products?sort=-name', ['sort' => '-price']);
 
// Appending parameters to existing ones
// http://localhost/products?sort=-name&search=samsung
url()->query('products?sort=-name', ['search' => 'samsung']);

This method particularly shines when implementing features that require sophisticated filtering and sorting capabilities. For instance, when building a product catalog with dynamic filtering:

class ProductController extends Controller
{
public function index(Request $request)
{
$products = Product::query();
 
// Apply filters based on request parameters
if ($request->has('category')) {
$products->where('category_id', $request->category);
}
 
// Apply sorting
if ($request->has('sort')) {
$sort = $request->sort;
$direction = str_starts_with($sort, '-') ? 'desc' : 'asc';
$column = ltrim($sort, '-');
$products->orderBy($column, $direction);
}
 
$products = $products->paginate(20);
 
// Generate next page URL with all current filters
$nextPageUrl = null;
if ($products->hasMorePages()) {
$params = $request->query();
$params['page'] = $products->currentPage() + 1;
$nextPageUrl = url()->query('products', $params);
}
 
return view('products.index', [
'products' => $products,
'nextPageUrl' => $nextPageUrl,
'filterUrl' => function($newParams) use ($request) {
// Generate URLs for filter controls while preserving other parameters
$params = array_merge($request->query(), $newParams);
return url()->query('products', $params);
}
]);
}
}

By using the query() method consistently across your application, you create a more maintainable codebase while eliminating common mistakes like improper parameter encoding or accidentally overriding existing query strings.

Harris Raftopoulos photo

Senior Software Engineer • Staff & Educator @ Laravel News • Co-organizer @ Laravel Greece Meetup

Sponsored

masteringlaravel logo
Laravel Code Review

Get expert guidance in a few days with a Laravel code review

Visit Laravel Code Review

The latest

View all →
Volker Dusch on the PHP RCE Vulnerabilities and Disclosure image

Volker Dusch on the PHP RCE Vulnerabilities and Disclosure

Read article
Decide with Jev: Turn AI Answers into Decisions with PHP Rules image

Decide with Jev: Turn AI Answers into Decisions with PHP Rules

Read article
Skuul: Open-Source School Management Built on Laravel image

Skuul: Open-Source School Management Built on Laravel

Read article
Laravel Read Replicas: Prevent Stale Reads After a Write image

Laravel Read Replicas: Prevent Stale Reads After a Write

Read article
Screenshot: Capture Images and PDFs with PHP and Laravel image

Screenshot: Capture Images and PDFs with PHP and Laravel

Read article
Reset Sticky Database Connections Between Laravel Queue Jobs image

Reset Sticky Database Connections Between Laravel Queue Jobs

Read article