whereLike
with AppServiceProvider
From freek.dev
<?phpnamespace App\Providers;use Illuminate\Database\Eloquent\Builder;// use Illuminate\Support\Arr;use Illuminate\Support\ServiceProvider;class AppServiceProvider extends ServiceProvider{ /** * Register any application services. */ public function register() { Builder::macro('whereLike', function (array $attributes, string $searchTerm) { // @phpstan-ignore-next-line $this->where(function (Builder $query) use ($attributes, $searchTerm) { foreach (Arr::wrap($attributes) as $attribute) { $query->when( str_contains($attribute, '.'), function (Builder $query) use ($attribute, $searchTerm) { [$relationName, $relationAttribute] = explode('.', $attribute); $query->orWhereHas($relationName, function (Builder $query) use ($relationAttribute, $searchTerm) { $query->where($relationAttribute, 'LIKE', "%{$searchTerm}%"); }); }, function (Builder $query) use ($attribute, $searchTerm) { $query->orWhere($attribute, 'LIKE', "%{$searchTerm}%"); } ); } }); return $this; }); }}
<?phpnamespace App\Http\Controllers;use App\Models\ContentDocument;use Illuminate\Http\Request;class SearchController extends Controller{ public function index(Request $request) { $results = ContentDocument::whereLike([ 'title', 'category', 'parent', ], $request->search) ->get() ; }}
Meilisearch with Laravel Scout
From laravel.com/docs/9.x/scout and meilisearch.com
composer require laravel/scout
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
composer require meilisearch/meilisearch-php http-interop/http-factory-guzzle
.env
SCOUT_DRIVER=collection # collection/meilisearch
MEILISEARCH_HOST=http://127.0.0.1:7700
MEILISEARCH_KEY=
<?phpnamespace App\Models;use Illuminate\Database\Eloquent\Factories\HasFactory;use Illuminate\Database\Eloquent\Model;use Laravel\Scout\Searchable;class Example extends Model{ use HasFactory; use Searchable; protected $fillable = [ 'title', 'category', 'description', ]; public function searchableAs() { return Str::slug(config('app.name').'_example', '_'); } public function toSearchableArray() { return [ 'title' => $this->title, 'category' => $this->category, 'description' => $this->description, ]; }}