78 lines
2.2 KiB
PHP
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}");
|
|
});
|
|
}
|
|
}
|