Этот пакет упрощает структурированный поиск из различных источников. Вот пример поиска по некоторым моделям. Мы уже провели небольшую подготовку самих моделей.
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> registerModel ( BlogPost ::class, ' title ' )
-> search ( ' john ' );
Поиск будет осуществляться без учета регистра. $searchResults
теперь содержит все модели User
, которые содержат john
в атрибуте name
, и BlogPost
, которые содержат «john» в атрибуте title
.
На ваш взгляд, теперь вы можете перебирать результаты поиска:
< h1 >Search</ h1 >
There are {{ $searchResults -> count () } } results.
@foreach ( $searchResults -> groupByType () as $type => $modelSearchResults )
< h2 > {{ $type } } </ h2 >
@foreach ( $modelSearchResults as $searchResult )
< ul >
< li >< a href = " {{ $searchResult -> url } } " > {{ $searchResult -> title } } </ a ></ li >
</ ul >
@endforeach
@endforeach
В этом примере мы использовали модели, но вы можете легко добавить аспект поиска для внешнего API, списка файлов или массива значений.
Мы вкладываем много ресурсов в создание лучших в своем классе пакетов с открытым исходным кодом. Вы можете поддержать нас, купив один из наших платных продуктов.
Мы очень признательны вам за отправку нам открытки из вашего родного города с указанием того, какой из наших пакетов вы используете. Наш адрес вы найдете на странице контактов. Все полученные открытки мы публикуем на нашей виртуальной стене открыток.
Вы можете установить пакет через композитор:
composer require spatie/laravel-searchable
Для поиска по моделям вам необходимо разрешить им реализовать интерфейс Searchable
.
namespace Spatie Searchable ;
interface Searchable
{
public function getSearchResult (): SearchResult ;
}
Вам нужно будет только добавить метод getSearchResult
к каждой модели с возможностью поиска, которая должна возвращать экземпляр SearchResult
. Вот как это может выглядеть для модели поста в блоге.
use Spatie Searchable Searchable ;
use Spatie Searchable SearchResult ;
class BlogPost extends Model implements Searchable
{
public function getSearchResult (): SearchResult
{
$ url = route ( ' blogPost.show ' , $ this -> slug );
return new Spatie Searchable SearchResult (
$ this ,
$ this -> title ,
$ url
);
}
}
Подготовив модели, вы можете искать их следующим образом:
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> search ( ' john ' );
Поиск будет осуществляться без учета регистра. $searchResults
теперь содержит все модели User
, которые содержат имя john
в атрибуте name
.
Вы также можете передать несколько атрибутов для поиска:
// use multiple model attributes
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' first_name ' , ' last_name ' )
-> search ( ' john ' );
// or use an array of model attributes
$ searchResults = ( new Search ())
-> registerModel ( User ::class, [ ' first_name ' , ' last_name ' ])
-> search ( ' john ' );
Чтобы получить более детальный контроль, вы также можете использовать вызываемый объект. Таким образом, вы также можете искать точные совпадения, применять области действия, отношения активной загрузки или даже фильтровать свой запрос, как если бы вы использовали построитель запросов.
$ search = ( new Search ())
-> registerModel ( User ::class, function ( ModelSearchAspect $ modelSearchAspect ) {
$ modelSearchAspect
-> addSearchableAttribute ( ' name ' ) // return results for partial matches on usernames
-> addExactSearchableAttribute ( ' email ' ) // only return results that exactly match the e-mail address
-> active ()
-> has ( ' posts ' )
-> with ( ' roles ' );
});
Вы не ограничены только регистрацией базовых моделей в качестве аспектов поиска. Вы можете легко создать свои собственные аспекты поиска, расширив класс SearchAspect
.
Рассмотрим следующий аспект пользовательского поиска для поиска по внешнему API:
class OrderSearchAspect extends SearchAspect
{
public function getResults ( string $ term ): Collection
{
return OrderApi :: searchOrders ( $ term );
}
}
Вот как вы можете его использовать:
$ searchResults = ( new Search ())
-> registerAspect ( OrderSearchAspect ::class)
-> search ( ' john ' );
Можно ограничить количество результатов, возвращаемых каждым аспектом, вызвав limitAspectResults
перед выполнением поиска.
$ searchResults = ( new Search ())
-> registerAspect ( BlogPostAspect ::class)
-> limitAspectResults ( 50 )
-> search ( ' How To ' );
Вот пример отображения результатов поиска:
< h1 >Search</ h1 >
There are {{ $searchResults -> count () } } results.
@foreach ( $searchResults -> groupByType () as $type => $modelSearchResults )
< h2 > {{ $type } } </ h2 >
@foreach ( $modelSearchResults as $searchResult )
< ul >
< a href = " {{ $searchResult -> url } } " > {{ $searchResult -> title } } </ a >
</ ul >
@endforeach
@endforeach
Вы можете настроить $type
, добавив общедоступное свойство $searchableType
в свою модель или аспект пользовательского поиска.
class BlogPost extends Model implements Searchable
{
public $ searchableType = ' custom named aspect ' ;
}
composer test
Пожалуйста, посетите CHANGELOG для получения дополнительной информации о том, что изменилось за последнее время.
Пожалуйста, смотрите ВКЛАД для получения подробной информации.
Если вы обнаружили ошибку, связанную с безопасностью, отправьте электронное письмо по адресу [email protected] вместо использования системы отслеживания проблем.
Лицензия MIT (MIT). Дополнительную информацию см. в файле лицензии.