beid212/model-search-kit
Laravel-пакет для выноса логики поиска: фильтрации и сортировки моделей в отдельные классы. Упрощает поддержку запросов и повторное использование фильтров. Установка через Composer, публикация конфигов через vendor:publish.
Installation
composer require beid212/model-search-kit
Publish the config (if needed):
php artisan vendor:publish --provider="Beid212\ModelSearchKit\ServiceProvider"
Basic Usage
Define a searchable model (e.g., User):
use Beid212\ModelSearchKit\Searchable;
class User extends Model implements Searchable
{
use \Beid212\ModelSearchKit\Traits\SearchableTrait;
}
First Query
$search = new \Beid212\ModelSearchKit\Search(User::class);
$search->filter('name', 'John'); // Exact match
$search->filter('age', '>', 25); // Range filter
$results = $search->execute();
Key Config
Check config/model-search-kit.php for default filter operators (e.g., =, >, <, contains).
Basic Filters
$search->filter('status', 'active'); // Equality
$search->filter('created_at', '<', now()->subYear()); // Date range
Dynamic Filtering (Request-Based)
public function index(Request $request)
{
$search = new \Beid212\ModelSearchKit\Search(User::class);
$search->applyRequestFilters($request); // Auto-parses `?name=John&status=active`
return $search->execute();
}
Custom Operators
Extend the FilterOperator enum or override in config:
'operators' => [
'contains' => 'LIKE',
'starts_with' => 'LIKE',
'ends_with' => 'LIKE',
],
Default Sort
$search->sort('name', 'asc'); // or 'desc'
Multi-Field Sort
$search->sort(['name' => 'asc', 'created_at' => 'desc']);
Paginated Results
$results = $search->paginate(10); // Returns \Illuminate\Pagination\LengthAwarePaginator
Eager Loading
$search->with(['posts', 'profile']); // Uses Eloquent's `with()`
$meta = [
'filters' => $search->getFilters(),
'sort' => $search->getSort(),
];
return response()->json($results, 200, $meta);
SQL Injection Risk
age must be numeric) to avoid edge cases.Case Sensitivity
filter('name', 'john') may not match John in MySQL.LOWER() in custom operators or normalize case in config:
'operators' => [
'icontains' => 'LIKE LOWER(:value)',
],
Performance with Complex Filters
status, created_at).->toSql() on the query builder to inspect generated SQL.Nested Relationship Filters
user.posts.title) isn’t supported out-of-the-box.Log Queries
\DB::enableQueryLog();
$search->execute();
\Log::info(\DB::getQueryLog());
Validate Config
Ensure config/model-search-kit.php matches your database dialect (e.g., LIKE vs. ILIKE for PostgreSQL).
Custom Filter Classes
Override Beid212\ModelSearchKit\Filters\Filter to add logic (e.g., multi-value filters):
class MultiValueFilter extends Filter
{
public function apply(Builder $query, $value)
{
$values = explode(',', $value);
return $query->whereIn('column', $values);
}
}
Hooks for Pre/Post-Execution
Use events (if the package supports them) or wrap the Search class:
$search = new CustomSearch($model);
$search->onExecute(function ($query) {
$query->where('active', true);
});
Testing
Mock the Search class or use Laravel’s query builder assertions:
$search = new \Beid212\ModelSearchKit\Search(User::class);
$search->filter('name', 'John');
$query = $search->getQuery();
$query->toSql(); // Assert SQL matches expectations
How can I help you explore Laravel packages today?