ldc-groupe/app/Console/Commands/MeilisearchUpdate.php
2026-01-15 12:27:12 +01:00

78 lines
2.2 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Models\Document;
use App\Models\DynamicPage;
use App\Models\News;
use App\Models\SearchIndex;
use Illuminate\Console\Command;
use Illuminate\Support\Str;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
use Meilisearch\Client;
class MeilisearchUpdate extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'meilisearch:update';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Configure Meilisearch and rebuilt all indexes in all locales.';
/**
* Execute the console command.
*
* @return void
*/
public function handle(): void
{
// Get new instance of Meilisearch client.
$client = new Client(
config('scout.meilisearch.host'),
config('scout.meilisearch.key')
);
// Get all supported locales defined in laravel localization config.
$locales = LaravelLocalization::getSupportedLocales();
collect(array_keys($locales))->map(function (string $locale) use ($client) {
$localeName = Str::upper($locale);
$indexName = config('scout.prefix') . $locale;
$index = $client->index($indexName);
$index->updateSearchableAttributes(['title', 'content']);
$index->updateFilterableAttributes(['type']);
$this->info("Meilisearch indexes configured for locale: {$localeName}");
app()->setLocale($locale);
SearchIndex::removeAllFromSearch();
collect([
News::class,
DynamicPage::class,
Document::class,
])->map(function(string $class) {
$class::chunk(100, function ($items) {
$items
->map
->toSearchDocument()
->filter()
->each
->searchable();
});
});
$this->info("Meilisearch indexes rebuilt for locale: {$localeName}");
});
}
}