Документация Laravel 10.x
Здесь ты найдешь сниппеты по Laravel и полезные советы по веб-разработке.
Laravel Scout предоставляет простое решение на основе драйверов для добавления полнотекстового поиска в ваши Eloquent-модели. Используя наблюдатели за моделями, Scout автоматически поддерживает синхронизацию ваших поисковых индексов с вашими записями Eloquent.
На данный момент Scout поставляется с драйверами Algolia, Meilisearch и драйверами MySQL / PostgreSQL (database
). Кроме того, Scout включает драйвер "collection", предназначенный для локального использования в разработке и не требующий внешних зависимостей или услуг сторонних поставщиков. Кроме того, написание пользовательских драйверов просто, и вы свободны расширять Scout своими собственными реализациями поиска.
Сначала установите Scout через менеджер пакетов Composer:
composer require laravel/scout
После установки Scout вы должны опубликовать файл конфигурации Scout с помощью команды Artisan vendor:publish
. Эта команда опубликует файл конфигурации scout.php
в каталог config
вашего приложения:
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
Наконец, добавьте трейт Laravel\Scout\Searchable
к модели, которую вы хотите сделать доступной для поиска. Этот трейт зарегистрирует наблюдатель модели, который автоматически поддерживает синхронизацию модели с вашим поисковым драйвером:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model;use Laravel\Scout\Searchable; class Post extends Model{ use Searchable;}
При использовании драйвера Algolia вам следует настроить учетные данные Algolia id
и secret
в файле конфигурации config/scout.php
. После настройки учетных данных вам также потребуется установить SDK Algolia PHP с помощью менеджера пакетов Composer:
composer require algolia/algoliasearch-client-php
Meilisearch - это быстрый и открытый поисковый двигатель с открытым исходным кодом. Если вы не знаете, как установить Meilisearch на своем локальном компьютере, вы можете использовать Laravel Sail, официально поддерживаемую среду разработки Docker для Laravel.
При использовании драйвера Meilisearch вам потребуется установить SDK Meilisearch PHP с помощью менеджера пакетов Composer:
composer require meilisearch/meilisearch-php http-interop/http-factory-guzzle
Затем установите переменную среды SCOUT_DRIVER
, а также ваши учетные данные Meilisearch host
и key
в файле .env
вашего приложения:
SCOUT_DRIVER=meilisearchMEILISEARCH_HOST=http://127.0.0.1:7700MEILISEARCH_KEY=masterKey
Для получения дополнительной информации о Meilisearch обратитесь к документации Meilisearch.
Кроме того, убедитесь, что вы устанавливаете версию meilisearch/meilisearch-php
, совместимую с версией вашего бинарного файла Meilisearch, ознакомившись с документацией Meilisearch о совместимости с бинарными файлами.
Внимание При обновлении Scout в приложении, использующем Meilisearch, всегда проверяйте наличие дополнительных изменений в самом сервисе Meilisearch.
Хотя для использования Scout это не является строгим требованием, настоятельно рекомендуется настроить драйвер очереди перед использованием библиотеки. Запуск рабочего процесса очереди позволит Scout ставить в очередь все операции, синхронизирующие информацию вашей модели с поисковыми индексами, что обеспечивает более быстрое время ответа для веб-интерфейса вашего приложения.
После настройки драйвера очереди установите значение опции queue
в файле конфигурации config/scout.php
в true
:
'queue' => true,
Даже если опция queue
установлена в false
, важно помнить, что некоторые драйверы Scout, такие как Algolia и Meilisearch, всегда индексируют записи асинхронно. Иными словами, хотя операция индексации завершена в вашем приложении Laravel, поисковый движок сам может не сразу отобразить новые и обновленные записи.
Для указания соединения и очереди, которые используют ваши задания Scout, вы можете определить опцию конфигурации queue
как массив:
'queue' => [ 'connection' => 'redis', 'queue' => 'scout'],
Каждая модель Eloquent синхронизируется с определенным поисковым "индексом", который содержит все доступные для поиска записи для этой модели. Другими словами, вы можете представлять каждый индекс как таблицу MySQL. По умолчанию каждая модель будет сохранена в индекс, соответствующий обычному "имени таблицы" модели. Обычно это множественная форма имени модели; однако вы можете настраивать индекс модели, переопределяя метод searchableAs
на модели:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model;use Laravel\Scout\Searchable; class Post extends Model{ use Searchable; /** * Получить имя индекса, связанного с моделью. */ public function searchableAs(): string { return 'posts_index'; }}
По умолчанию весь массив toArray
данной модели будет сохранен в ее поисковом индексе. Если вы хотите настроить данные, синхронизируемые с поисковым индексом, вы можете переопределить метод toSearchableArray
на модели:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model;use Laravel\Scout\Searchable; class Post extends Model{ use Searchable; /** * Получить массив данных для индексации модели. * * @return array<string, mixed> */ public function toSearchableArray(): array { $array = $this->toArray(); // Настроить массив данных... return $array; }}
Некоторые поисковые движки, такие как Meilisearch, будут выполнять операции фильтрации (>
, <
, и так далее) только для данных правильного типа. Поэтому, используя эти поисковые движки и настраивая ваши данные для поиска, убедитесь, что числовые значения приведены к правильному типу:
public function toSearchableArray(){ return [ 'id' => (int) $this->id, 'name' => $this->name, 'price' => (float) $this->price, ];}
В отличие от других драйверов Scout, Meilisearch требует предварительного определения настроек поиска индекса, таких как фильтруемые атрибуты, сортируемые атрибуты и другие поддерживаемые поля настроек.
Фильтруемые атрибуты - это атрибуты, по которым вы планируете фильтровать при использовании метода where
Scout, а сортируемые атрибуты - это атрибуты, по которым вы планируете сортировать при использовании метода orderBy
Scout. Чтобы определить настройки индекса, отредактируйте раздел index-settings
в конфигурационной записи meilisearch
в файле конфигурации scout
вашего приложения:
use App\Models\User;use App\Models\Flight; 'meilisearch' => [ 'host' => env('MEILISEARCH_HOST', 'http://localhost:7700'), 'key' => env('MEILISEARCH_KEY', null), 'index-settings' => [ User::class => [ 'filterableAttributes'=> ['id', 'name', 'email'], 'sortableAttributes' => ['created_at'], // Другие поля настроек... ], Flight::class => [ 'filterableAttributes'=> ['id', 'destination'], 'sortableAttributes' => ['updated_at'], ], ],],
Если модель, лежащая в основе данного индекса, может быть мягко удалена и включена в массив index-settings
, Scout автоматически включит поддержку фильтрации мягко удаленных моделей на этом индексе. Если у вас нет других атрибутов для фильтрации или сортировки для определения индекса модели, вы можете просто добавить пустую запись в массив index-settings
для этой модели:
'index-settings' => [ Flight::class => []],
После настройки настроек индекса вашего приложения вы должны вызвать команду Artisan scout:sync-index-settings
. Эта команда сообщит Meilisearch о ваших текущих настроенных настройках индекса. Для удобства вы можете включить эту команду в свой процесс развертывания:
php artisan scout:sync-index-settings
По умолчанию Scout будет использовать первичный ключ модели как уникальный идентификатор / ключ модели, который хранится в поисковом индексе. Если вам нужно настроить это поведение, вы можете переопределить методы getScoutKey
и getScoutKeyName
на модели:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model;use Laravel\Scout\Searchable; class User extends Model{ use Searchable; /** * Получить значение, используемое для индексации модели. */ public function getScoutKey(): mixed { return $this->email; } /** * Получить имя ключа, используемого для индексации модели. */ public function getScoutKeyName(): mixed { return 'email'; }}
При поиске Scout обычно использует поисковый двигатель, указанный в файле конфигурации приложения scout
. Однако поисковый двигатель для конкретной модели можно изменить, переопределив метод searchableUsing
на модели:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model;use Laravel\Scout\Engines\Engine;use Laravel\Scout\EngineManager;use Laravel\Scout\Searchable; class User extends Model{ use Searchable; /** * Получить движок, используемый для индексации модели. */ public function searchableUsing(): Engine { return app(EngineManager::class)->engine('meilisearch'); }}
Scout также позволяет автоматически идентифицировать пользователей при использовании Algolia. Ассоциирование аутентифицированного пользователя с операциями поиска может быть полезным при просмотре аналитики поиска в панели управления Algolia. Вы можете включить идентификацию пользователя, определив переменную окружения SCOUT_IDENTIFY
со значением true
в файле .env
вашего приложения:
SCOUT_IDENTIFY=true
Включение этой функции также передаст IP-адрес запроса и основной идентификатор вашего аутентифицированного пользователя в Algolia, чтобы эти данные были связаны с любым запросом на поиск, выполненным пользователем.
Внимание В настоящее время движок базы данных поддерживает MySQL и PostgreSQL.
Если ваше приложение взаимодействует с небольшими или средними базами данных или имеет легкую нагрузку, вам может быть удобнее начать использовать "database" движок Scout. Движок базы данных будет использовать запросы "where like" и полнотекстовые индексы при фильтрации результатов из вашей существующей базы данных, чтобы определить подходящие результаты поиска для вашего запроса.
Чтобы использовать базовый двигатель, просто установите значение переменной окружения SCOUT_DRIVER
в database
, или укажите напрямую драйвер database
в файле конфигурации scout
вашего приложения:
SCOUT_DRIVER=database
После указания базового двигателя в качестве предпочтительного драйвера, вам нужно настроить ваши данные для поиска. Затем вы можете начать выполнять поисковые запросы по вашим моделям. Индексация поискового движка, такая как индексация, необходимая для заполнения индексов Algolia или Meilisearch, не требуется при использовании базы данных.
По умолчанию базовый двигатель будет выполнять запрос "where like" для каждого атрибута модели, который вы настроили как доступный для поиска. Однако в некоторых ситуациях это может привести к плохой производительности. Поэтому стратегия поиска базового двигателя может быть настроена так, чтобы некоторые указанные столбцы использовали запросы полнотекстового поиска или использовали только ограничения "where like" для поиска префиксов строк (example%
), а не поиска внутри всей строки (%example%
).
Для определения этого поведения вы можете присвоить PHP-атрибуты методу toSearchableArray
вашей модели. Любые столбцы, которым не присвоено дополнительное поведение поиска, будут продолжать использовать стратегию "where like" по умолчанию:
use Laravel\Scout\Attributes\SearchUsingFullText;use Laravel\Scout\Attributes\SearchUsingPrefix; /** * Получить массив данных для индексации модели. * * @return array<string, mixed> */#[SearchUsingPrefix(['id', 'email'])]#[SearchUsingFullText(['bio'])]public function toSearchableArray(): array{ return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, 'bio' => $this->bio, ];}
Внимание Прежде чем указывать, что столбец должен использовать условия полнотекстового запроса, убедитесь, что столбцу присвоен индекс полнотекстового поиска.
Хотя вы свободны использовать поисковые двигатели Algolia или Meilisearch во время локальной разработки, вам может быть удобнее начать с двигателя "collection". Двигатель коллекции будет использовать запросы "where" и фильтрацию коллекции результатов из вашей существующей базы данных для определения подходящих результатов поиска для вашего запроса. При использовании этого двигателя не требуется "индексировать" ваши доступные для поиска модели, так как они просто будут извлекаться из вашей локальной базы данных.
Чтобы использовать двигатель коллекции, просто установите значение переменной окружения SCOUT_DRIVER
в collection
, или укажите напрямую драйвер collection
в файле конфигурации scout
вашего приложения:
SCOUT_DRIVER=collection
После указания драйвера коллекции в качестве предпочтительного драйвера, вы можете начать выполнять поисковые запросы по вашим моделям. Индексация поискового двигателя, такая как индексация, необходимая для заполнения индексов Algolia или Meilisearch, не требуется при использовании двигателя коллекции.
На первый взгляд двигатели "database" и "collection" довольно похожи. Они оба взаимодействуют напрямую с вашей базой данных для получения результатов поиска. Однако двигатель коллекции не использует полнотекстовые индексы или условия LIKE
для поиска соответствующих записей. Вместо этого он извлекает все возможные записи и использует вспомогательный метод Laravel Str::is
для определения, существует ли строка поиска в значениях атрибутов модели.
Двигатель коллекции является наиболее переносимым поисковым двигателем, так как он работает во всех реляционных базах данных, поддерживаемых Laravel (включая SQLite и SQL Server); однако он менее эффективен, чем базовый двигатель Scout.
Если вы устанавливаете Scout в существующий проект, у вас может уже быть записи в базе данных, которые вам нужно импортировать в ваши индексы. Scout предоставляет команду Artisan scout:import
, которую вы можете использовать для импорта всех ваших существующих записей в ваши поисковые индексы:
php artisan scout:import "App\Models\Post"
Команду flush
можно использовать для удаления всех записей модели из ваших поисковых индексов:
php artisan scout:flush "App\Models\Post"
Если вы хотите изменить запрос, используемый для извлечения всех ваших моделей при пакетном импорте, вы можете определить метод makeAllSearchableUsing
в вашей модели. Это отличное место для добавления предварительной загрузки отношений, которая может потребоваться перед импортом ваших моделей:
use Illuminate\Database\Eloquent\Builder; /** * Изменить запрос, используемый для извлечения моделей при совершении их всех доступными для поиска. */protected function makeAllSearchableUsing(Builder $query): Builder{ return $query->with('author');}
Внимание Метод
makeAllSearchableUsing
может быть не применим при использовании очереди для пакетного импорта моделей. Отношения не восстанавливаются, когда коллекции моделей обрабатываются заданиями.
После добавления трейта Laravel\Scout\Searchable
к модели, вам достаточно выполнить save
или create
для экземпляра модели, и он автоматически добавится в ваш поисковый индекс. Если вы настроили Scout на использование очередей, эта операция будет выполняться в фоновом режиме вашим рабочим процессом очереди:
use App\Models\Order; $order = new Order; // ... $order->save();
Если вы хотите добавить коллекцию моделей в ваш поисковый индекс через запрос Eloquent, вы можете цеплять метод searchable
к запросу Eloquent. Метод searchable
будет разбивать результаты запроса и добавлять записи в ваш поисковый индекс. Снова, если вы настроили Scout на использование очередей, все куски будут импортированы в фоновом режиме вашими рабочими процессами очереди:
use App\Models\Order; Order::where('price', '>', 100)->searchable();
Вы также можете вызвать метод searchable
для экземпляра отношения Eloquent:
$user->orders()->searchable();
Или, если у вас уже есть коллекция экземпляров Eloquent в памяти, вы можете вызвать метод searchable
для экземпляра коллекции, чтобы добавить экземпляры моделей в соответствующий индекс:
$orders->searchable();
Примечание Метод
searchable
можно рассматривать как операцию "upsert". Другими словами, если запись модели уже существует в вашем индексе, она будет обновлена. Если ее нет в поисковом индексе, она будет добавлена в индекс.
Чтобы обновить доступную для поиска модель, вам нужно только обновить свойства экземпляра модели и выполнить save
модели в вашей базе данных. Scout автоматически сохранит изменения в вашем поисковом индексе:
use App\Models\Order; $order = Order::find(1); // Обновить порядок... $order->save();
Вы также можете вызвать метод searchable
для экземпляра запроса Eloquent, чтобы обновить коллекцию моделей. Если модели не существуют в вашем поисковом индексе, они будут созданы:
Order::where('price', '>', 100)->searchable();
Если вы хотите обновить записи индекса поиска для всех моделей в отношении, вы можете вызвать searchable
для экземпляра отношения:
$user->orders()->searchable();
Или, если у вас уже есть коллекция экземпляров Eloquent в памяти, вы можете вызвать метод searchable
для экземпляра коллекции, чтобы обновить экземпляры моделей в соответствующем индексе:
$orders->searchable();
Иногда вам может потребоваться подготовить коллекцию моделей перед их сделкой доступными для поиска. Например, вы можете хотеть жадно загрузить отношение, чтобы данные отношения могли эффективно добавляться в ваш поисковый индекс. Для этого определите метод makeSearchableUsing
на соответствующей модели:
use Illuminate\Database\Eloquent\Collection; /** * Изменить коллекцию моделей, сделанных доступными для поиска. */public function makeSearchableUsing(Collection $models): Collection{ return $models->load('author');}
Чтобы удалить запись из вашего индекса, вы можете просто выполнить delete
модели из базы данных. Это можно сделать даже при использовании моделей с мягким удалением:
use App\Models\Order; $order = Order::find(1); $order->delete();
Если вы не хотите извлекать модель перед удалением записи, вы можете использовать метод unsearchable
для экземпляра запроса Eloquent:
Order::where('price', '>', 100)->unsearchable();
Если вы хотите удалить записи индекса поиска для всех моделей в отношении, вы можете вызвать unsearchable
для экземпляра отношения:
$user->orders()->unsearchable();
Или, если у вас уже есть коллекция экземпляров Eloquent в памяти, вы можете вызвать метод unsearchable
для экземпляра коллекции, чтобы удалить экземпляры моделей из соответствующего индекса:
$orders->unsearchable();
Иногда вам может потребоваться выполнить пакет операций Eloquent на модели без синхронизации данных модели с вашим поисковым индексом. Вы можете сделать это, используя метод withoutSyncingToSearch
. Этот метод принимает единственное замыкание, которое будет немедленно выполнено. Любые операции модели, выполняемые внутри замыкания, не будут синхронизированы с индексом модели:
use App\Models\Order; Order::withoutSyncingToSearch(function () { // Выполнить действия с моделью...});
Иногда вам может потребоваться сделать модель доступной для поиска только при определенных условиях. Например, представьте, что у вас есть модель App\Models\Post
, которая может находиться в одном из двух состояний: "черновик" и "опубликован". Вы можете хотеть разрешить сделать доступными для поиска только "опубликованные" сообщения. Для этого вы можете определить метод shouldBeSearchable
в вашей модели:
/** * Определить, должна ли модель быть доступной для поиска. */public function shouldBeSearchable(): bool{ return $this->isPublished();}
Метод shouldBeSearchable
применяется только при взаимодействии с моделями через методы save
и create
, запросы или отношения. Прямое сделывание моделей или коллекций доступными для поиска с использованием метода searchable
переопределит результат метода shouldBeSearchable
.
Внимание Метод
shouldBeSearchable
не применим при использовании "database" движка Scout, поскольку все данные для поиска всегда хранятся в базе данных. Для достижения подобного поведения при использовании движка базы данных следует использовать условия where.
Вы можете начать поиск модели с использованием метода search
. Метод поиска принимает одну строку, которая будет использоваться для поиска ваших моделей. Затем вы должны цеплять метод get
к запросу поиска, чтобы получить экземпляры Eloquent, соответствующие данному запросу поиска:
use App\Models\Order; $orders = Order::search('Star Trek')->get();
Поскольку поисковые запросы Scout возвращают коллекцию экземпляров Eloquent, вы можете даже возвращать результаты напрямую из маршрута или контроллера, и они автоматически будут преобразованы в JSON:
use App\Models\Order;use Illuminate\Http\Request; Route::get('/search', function (Request $request) { return Order::search($request->search)->get();});
Если вы хотите получить необработанные результаты поиска до их преобразования в экземпляры Eloquent, вы можете использовать метод raw
:
$orders = Order::search('Star Trek')->raw();
Обычно поисковые запросы выполняются в индексе, указанном методом searchableAs
модели. Однако вы можете использовать метод within
для указания пользовательского индекса, который следует искать вместо этого:
$orders = Order::search('Star Trek') ->within('tv_shows_popularity_desc') ->get();
Scout позволяет добавлять простые условия "where" в ваши поисковые запросы. В настоящее время эти условия поддерживают только базовые проверки равенства чисел и в основном полезны для ограничения поисковых запросов по ID владельца:
use App\Models\Order; $orders = Order::search('Star Trek')->where('user_id', 1)->get();
Кроме того, метод whereIn
может использоваться для проверки того, что значение данного столбца содержится в данном массиве:
$orders = Order::search('Star Trek')->whereIn( 'status', ['open', 'paid'])->get();
Метод whereNotIn
проверяет, что значение данного столбца не содержится в данном массиве:
$orders = Order::search('Star Trek')->whereNotIn( 'status', ['closed'])->get();
Поскольку поисковый индекс не является реляционной базой данных, более сложные условия "where" в настоящее время не поддерживаются.
Внимание Если ваше приложение использует Meilisearch, вы должны настроить атрибуты для фильтрации перед использованием "where" условий Scout.
Помимо получения коллекции моделей, вы можете пагинировать результаты поиска с использованием метода paginate
. Этот метод вернет экземпляр Illuminate\Pagination\LengthAwarePaginator
так же, как если бы вы пагинировали традиционный запрос Eloquent:
use App\Models\Order; $orders = Order::search('Star Trek')->paginate();
Вы можете указать, сколько моделей получить на страницу, передав количество в качестве первого аргумента методу paginate
:
$orders = Order::search('Star Trek')->paginate(15);
После получения результатов вы можете отобразить результаты и отобразить ссылки на страницы с использованием Blade, так же, как если бы вы пагинировали традиционный запрос Eloquent:
<div class="container"> @foreach ($orders as $order) {{ $order->price }} @endforeach</div> {{ $orders->links() }}
Конечно же, если вы хотите получить результаты пагинации в формате JSON, вы можете вернуть экземпляр пагинатора напрямую из маршрута или контроллера:
use App\Models\Order;use Illuminate\Http\Request; Route::get('/orders', function (Request $request) { return Order::search($request->input('query'))->paginate(15);});
Внимание Поскольку поисковые движки не осведомлены о глобальных определениях области видимости вашей модели Eloquent, не следует использовать глобальные области видимости в приложениях, использующих пагинацию Scout. Или же следует воссоздавать ограничения глобальной области видимости при поиске через Scout.
Если ваши индексированные модели используют мягкое удаление и вам нужно выполнять поиск ваших моделей с мягким удалением, установите опцию soft_delete
в файле конфигурации config/scout.php
в значение true
:
'soft_delete' => true,
Когда эта опция конфигурации установлена в true
, Scout не будет удалять модели с мягким удалением из поискового индекса. Вместо этого будет установлен скрытый атрибут __soft_deleted
на проиндексированную запись. Затем вы можете использовать методы withTrashed
или onlyTrashed
для получения записей с мягким удалением при поиске:
use App\Models\Order; // Включить удаленные записи при получении результатов...$orders = Order::search('Star Trek')->withTrashed()->get(); // Включить только удаленные записи при получении результатов...$orders = Order::search('Star Trek')->onlyTrashed()->get();
Примечание Когда мягко удаленная модель окончательно удаляется с использованием
forceDelete
, Scout автоматически удалит ее из поискового индекса.
Если вам нужно выполнить продвинутую настройку поведения поиска движка, вы можете передать замыкание в качестве второго аргумента методу search
. Например, вы можете использовать это обратное вызов, чтобы добавить данные о местоположении в ваши параметры поиска перед передачей запроса поиска в Algolia:
use Algolia\AlgoliaSearch\SearchIndex;use App\Models\Order; Order::search( 'Star Trek', function (SearchIndex $algolia, string $query, array $options) { $options['body']['query']['bool']['filter']['geo_distance'] = [ 'distance' => '1000km', 'location' => ['lat' => 36, 'lon' => 111], ]; return $algolia->search($query, $options); })->get();
После того как Scout извлекает список соответствующих моделей Eloquent из поискового двигателя вашего приложения, Eloquent используется для извлечения всех соответствующих моделей по их первичным ключам. Вы можете настроить этот запрос, вызвав метод query
. Метод query
принимает замыкание, которое получит экземпляр построителя запросов Eloquent в качестве аргумента:
use App\Models\Order;use Illuminate\Database\Eloquent\Builder; $orders = Order::search('Star Trek') ->query(fn (Builder $query) => $query->with('invoices')) ->get();
Поскольку это обратный вызов вызывается после того, как соответствующие модели уже были извлечены из поискового двигателя вашего приложения, метод query
не должен использоваться для "фильтрации" результатов. Вместо этого следует использовать условия where Scout.
Если один из встроенных поисковых двигателей Scout не соответствует вашим потребностям, вы можете написать свой собственный пользовательский двигатель и зарегистрировать его в Scout. Ваш двигатель должен расширять абстрактный класс Laravel\Scout\Engines\Engine
. Этот абстрактный класс содержит восемь методов, которые ваш пользовательский двигатель должен реализовать:
use Laravel\Scout\Builder; abstract public function update($models);abstract public function delete($models);abstract public function search(Builder $builder);abstract public function paginate(Builder $builder, $perPage, $page);abstract public function mapIds($results);abstract public function map(Builder $builder, $results, $model);abstract public function getTotalCount($results);abstract public function flush($model);
Вам может быть полезно ознакомиться с реализациями этих методов в классе Laravel\Scout\Engines\AlgoliaEngine
. Этот класс предоставит вам хорошую отправную точку для изучения того, как реализовать каждый из этих методов в своем собственном двигателе.
После написания вашего собственного двигателя вы можете зарегистрировать его в Scout, используя метод extend
менеджера двигателей Scout. Менеджер двигателей Scout может быть получен из контейнера служб Laravel. Вы должны вызвать метод extend
из метода boot
вашего класса App\Providers\AppServiceProvider
или любого другого служебного провайдера, используемого вашим приложением:
use App\ScoutExtensions\MySqlSearchEngine;use Laravel\Scout\EngineManager; /** * Настроить все службы приложения. */public function boot(): void{ resolve(EngineManager::class)->extend('mysql', function () { return new MySqlSearchEngine; });}
После регистрации вашего двигателя вы можете указать его в качестве вашего основного драйвера Scout в файле конфигурации config/scout.php
вашего приложения:
'driver' => 'mysql',