whereLike with AppServiceProvider

From freek.dev

<?php

namespace 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;
    });
  }
}
<?php

namespace 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=
<?php

namespace 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,
    ];
  }
}

spatie/searchable

From github.com/spatie/laravel-searchable