abo/larasearch
Laravel package that adds simple, lightweight search to your app. Provides a straightforward API to index and query models, helping you build basic site or admin search without heavy external services or complex setup.
Installation:
composer require abo/larasearch
Publish the config file (if needed):
php artisan vendor:publish --provider="Abo\Larasearch\LarasearchServiceProvider"
Basic Usage:
Searchable trait to your Eloquent model:
use Abo\Larasearch\Searchable;
class Product extends Model
{
use Searchable;
}
searchableFields() method:
protected function searchableFields()
{
return ['name', 'description', 'sku'];
}
$results = Product::search('query')->get();
First Use Case: Implement a search feature in a controller:
public function search(Request $request)
{
$query = $request->input('q');
$products = Product::search($query)->paginate(10);
return view('products.search', compact('products'));
}
Basic Search:
// Simple keyword search
$results = Model::search('term')->get();
Advanced Querying:
$results = Model::search('term')
->where('category', 'electronics')
->orderBy('created_at', 'desc')
->get();
orSearch for multiple terms:
$results = Model::search('term1')->orSearch('term2')->get();
Pagination & Sorting:
$results = Model::search('term')->paginate(15);
$results = Model::search('term')->orderBy('name')->get();
Full-Text Search:
FULLTEXT).searchableFields() for full-text search.Integration with API:
Route::get('/api/search', function (Request $request) {
return Model::search($request->query('q'))->paginate(20);
});
Search in Relationships:
with() to eager-load relationships:
$results = Model::with('category')->search('term')->get();
Custom Search Logic:
search() method in your model:
public function scopeCustomSearch($query, $term)
{
return $query->where(function($q) use ($term) {
$q->where('name', 'like', "%{$term}%")
->orWhere('description', 'like', "%{$term}%");
});
}
Database Compatibility:
Case Sensitivity:
Performance:
body) without proper indexing.Special Characters:
%) in queries may not work as expected. Escape or handle them manually:
$query = str_replace(['%', '_'], ['\%', '\_'], $request->input('q'));
Config Overrides:
Log Queries: Enable Laravel's query logging to inspect generated SQL:
DB::enableQueryLog();
$results = Model::search('term')->get();
dd(DB::getQueryLog());
Check Field Names:
searchableFields() will silently fail. Validate field names against your database schema.Test with Simple Queries: Start with single-word searches to isolate issues before testing complex queries.
Extend Searchable Trait:
class SearchableModel extends Model
{
use Searchable;
protected function searchableFields()
{
return ['global_search_field'];
}
}
Use Events:
Model::search('term')->each(function ($model) {
event(new SearchPerformed($model, 'term'));
});
Combine with Scout:
Custom Analyzers:
Fallback for Empty Results:
$results = Model::search($term)->get();
return $results->isEmpty() ? response()->json(['message' => 'No results found']) : $results;
How can I help you explore Laravel packages today?