DEV Community

Discussion on: How to add simple search to your Laravel blog/website?

Collapse
 
aneesdhansey profile image
Anees Dhansey

You can register a macro in your AppServiceProvider.php and use with the query builder for any table across your whole project.
In the boot method of your AppServiceProvider.php:

Builder::macro('whereLike', function ($attributes, string $searchTerm) {
            $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;
        });
Enter fullscreen mode Exit fullscreen mode

Usage:

$users = User::query();
$users = $users->whereLike(['username', 'name', 'email'], $searchText);
Enter fullscreen mode Exit fullscreen mode

Credits:
Freek.Dev