PHP
Implement Reusable Query Logic with Laravel Eloquent Local Scopes
Streamline and organize complex database queries in Laravel Eloquent by defining reusable local query scopes for common filtering or data retrieval patterns.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class Product extends Model
{
/**
* Scope a query to only include active products.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeActive(Builder $query): Builder
{
return $query->where('is_active', true);
}
/**
* Scope a query to only include products of a given category.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $category
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeCategory(Builder $query, string $category): Builder
{
return $query->where('category', $category);
}
}
// Usage in a controller or elsewhere:
$activeProducts = Product::active()->get();
$electronics = Product::category('Electronics')->active()->orderBy('price', 'desc')->get();
$cheapActiveElectronics = Product::active()->category('Electronics')->where('price', '<', 100)->get();
How it works: Local scopes allow you to define common sets of constraints that you may easily re-use throughout your application. This snippet illustrates creating two local scopes: `scopeActive` to filter active products and `scopeCategory` to filter by a specific category. These scopes can be chained together with other query builder methods, making your Eloquent queries more readable, maintainable, and reusable.