Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Searcher Laravel Package

shureban/laravel-searcher

View on GitHub
Deep Wiki
Context7
## Technical Evaluation
**Architecture fit**
The `shureban/laravel-searcher` package is a **lightweight, declarative query builder** designed to abstract complex filtering, sorting, and pagination logic in Laravel applications. It fits well within:
- **Monolithic Laravel apps** needing centralized search logic (e.g., admin dashboards, reporting tools).
- **Microservices** where search endpoints are decoupled from business logic (via API contracts).
- **Legacy systems** migrating to modern search patterns without full-text search engines (e.g., Algolia, Elasticsearch).

The package’s **Eloquent-centric design** ensures tight integration with Laravel’s ORM, while its **filter-based architecture** (e.g., `Between`, `Relation`, `Callback`) allows for granular control over query construction. This makes it ideal for:
- **Dynamic filtering** (e.g., user-facing search forms).
- **Complex joins** (e.g., filtering related models via `Relation` filters).
- **Custom sorting** (override `sortColumn` or `applySortBy`).

**Integration feasibility**
**High feasibility** with minimal friction:
- **Laravel-native**: Leverages service providers, request validation, and Eloquent under the hood.
- **Zero-config**: Default installation requires only a Composer dependency and service provider registration.
- **Extensible**: Supports custom filters (e.g., `Callback`) and query modifiers (e.g., `OrNull`, `MultipleOr`).
- **Validation-aware**: Integrates with Laravel’s request validation (e.g., `FormRequest` rules for `sort_column`).

**Technical risk**
**Low to moderate risk**, contingent on implementation:
- **Security**: The package handles **user-provided input** in query construction (e.g., `Like`, `Between`). While the latest release (v2.4.2) includes a **security fix**, prior versions may have exposed risks if:
  - Dynamic input (e.g., `request->input('id')`) was passed directly to filters without sanitization.
  - Custom `Callback` filters used raw SQL or unsanitized values.
  - **Mitigation**: Validate all request parameters in `FormRequest` classes (as shown in the example) and avoid passing untrusted data to filters like `Like` or `Between`.
- **Performance**: Complex filters (e.g., nested `Relation` queries) could lead to **N+1 issues** or inefficient joins if not optimized.
  - **Mitigation**: Use `with()` in `getQuery()` to eager-load relations or leverage Laravel’s query caching.
- **Compatibility**: No known conflicts with Laravel 10.x or PHP 8.1+, but **custom filters** might require adjustments if using newer Laravel features (e.g., model macros).

**Key questions**
1. **Input Validation**:
   - Are all search parameters validated in `FormRequest` classes (as per the example)?
   - Are there custom filters (e.g., `Callback`) that bypass validation?
2. **Query Complexity**:
   - Do any searchers use deeply nested `Relation` filters that could cause performance issues?
   - Are there existing queries that might conflict with the package’s default behavior (e.g., global scopes)?
3. **Testing Coverage**:
   - Are search endpoints tested for edge cases (e.g., empty filters, malformed dates, SQL injection attempts)?
   - Is there a regression test suite for the package’s filters (e.g., `Between`, `OrNull`)?
4. **Scaling Needs**:
   - Will this package handle expected query volumes (e.g., high-traffic search endpoints)?
   - Are there plans to offload search to a dedicated service (e.g., Elasticsearch) in the future?
5. **Maintenance**:
   - Is the team comfortable maintaining custom searchers (e.g., extending `Searcher`) long-term?
   - Are there plans to standardize search logic across the codebase (e.g., shared base searchers)?

---

## Integration Approach
**Stack fit**
**Fully compatible** with Laravel’s ecosystem:
- **Laravel Core**: Works with Laravel 8.x–10.x (PHP 8.0+).
- **Eloquent**: Built on top of Eloquent’s query builder (`Builder`).
- **Validation**: Integrates with Laravel’s request validation (`FormRequest`).
- **APIs**: Supports JSON responses via `JsonResponse` (as shown in the controller example).
- **Testing**: Can be tested with Laravel’s testing tools (e.g., `HttpTests`, `DatabaseMigrations`).

**Migration path**
**Greenfield or incremental adoption**:
1. **Pilot Phase**:
   - Start with a **single search-heavy endpoint** (e.g., admin user search).
   - Replace manual query construction with a `Searcher` class.
   - Example: Convert a controller with hardcoded `where` clauses to use `Between`, `Like`, etc.
2. **Full Rollout**:
   - Gradually replace all dynamic queries with `Searcher` classes.
   - Standardize filter logic (e.g., reuse `Boolean`, `In` filters across searchers).
3. **Legacy Systems**:
   - Use the package to **wrap existing search logic** (e.g., wrap a complex `where` chain in `getQuery()`).

**Compatibility**
- **Backward**: 100% compatible with Laravel 8.x–10.x and PHP 8.0+.
- **Forward**: No breaking changes in v2.4.2; future versions should maintain compatibility if they follow semantic versioning.
- **Dependencies**:
  - No external dependencies beyond Laravel’s core.
  - Transitive dependencies: `illuminate/database` (already in Laravel).
- **Customizations**:
  - Override `getQuery()` to add global scopes or custom clauses.
  - Extend `Searcher` to add pre/post-processing logic.

**Sequencing**
1. **Pre-integration**:
   - Audit existing search logic for complexity (e.g., nested joins, raw SQL).
   - Identify endpoints that would benefit most from the package (e.g., high-maintenance queries).
2. **Integration**:
   - Install the package: `composer require shureban/laravel-searcher`.
   - Publish config: `php artisan vendor:publish --provider="Shureban\LaravelSearcher\SearcherServiceProvider"`.
   - Create a base `Searcher` class for shared logic (e.g., default sorting).
3. **Testing**:
   - Test with edge cases (e.g., empty filters, invalid dates, malformed input).
   - Verify performance with `tntsearch` or `DB::enableQueryLog()`.
4. **Deployment**:
   - Roll out in phases (e.g., non-critical endpoints first).
   - Monitor for regressions (e.g., query timeouts, 500 errors).

---
## Operational Impact
**Maintenance**
- **Pros**:
  - **Reduced boilerplate**: Centralizes query logic in `Searcher` classes.
  - **Easier updates**: Future filter improvements (e.g., new `BetweenDates`) can be adopted without refactoring.
  - **Consistent patterns**: Enforces a standard way to handle filtering/sorting.
- **Cons**:
  - **Custom logic**: Complex queries may still require custom `Callback` filters, increasing maintenance.
  - **Debugging**: Stack traces for query issues may point to `Searcher` internals rather than business logic.
- **Best Practices**:
  - Document filter mappings (e.g., `request param → DB column`) in `getFilters()`.
  - Use interfaces (e.g., `SearcherInterface`) for shared contracts across searchers.

**Support**
- **Common Issues**:
  - **Filter misconfiguration**: E.g., passing a string to a numeric filter (`Between`).
  - **Performance bottlenecks**: Nested `Relation` filters causing slow queries.
  - **Validation errors**: Missing rules in `FormRequest` for new search parameters.
- **Support Resources**:
  - Provide a **cheat sheet** for filter types (e.g., `Like` vs. `Equal`).
  - Include **query logging** in support guides (e.g., `DB::enableQueryLog()`).
- **Escalation Path**:
  - For complex issues, revert to raw queries temporarily while debugging.

**Scaling**
- **Performance**:
  - **Pros**: Reduces duplicate query logic; encourages reusable filters.
  - **Cons**: Poorly optimized `Searcher` classes can degrade performance (e.g., unindexed columns in `Like` filters).
  - **Mitigations**:
    - Add database indexes for frequently filtered columns.
    - Use `with()` to eager-load relations in `getQuery()`.
    - Cache frequent queries (e.g., `@cache` directive in routes).
- **Load Testing**:
  - Test with high concurrency (e.g., 1000+ requests/sec) to validate query planning.
  - Monitor database load (e.g., `EXPLAIN ANALYZE` for complex queries).

**Failure modes**
- **Query Errors**:
  - **Cause**: Invalid filter input (e.g., non-numeric value for `Between`).
  - **Impact**: 500 errors or silent failures (e.g., empty results).
  - **Mitigation**: Validate all request parameters in `FormRequest`.
- **Performance Degradation**:
  - **Cause**: Inefficient filters (e.g., `Like` on unindexed text columns).
  - **Impact**: Slow responses under load.
  - **Mitigation**: Profile queries with `tntsearch` or `
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
craftcms/url-validator
directorytree/privacy-filter-classifier
directorytree/privacy-filter
datacore/hub-sdk
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony
develia/geo-bundle
dreamzy/livewire-charts
touchestate-sdk/php-sdk
22h/doctrine-garbage-collection-bundle
agtp/agtp-php
agtp/mod-php
splash/sonata-admin
splash/metadata
splash/openapi
splash/scopes
splash/toolkit
testo/output-teamcity
testo/bridge-symfony