Этот пакет Laravel позволяет вам выполнять поиск по нескольким моделям Eloquent. Он поддерживает сортировку, нумерацию страниц, запросы с ограниченной областью, отношения быстрой загрузки и поиск по одному или нескольким столбцам.
❤️ Мы с гордостью поддерживаем сообщество, разрабатывая пакеты Laravel и раздавая их бесплатно. Если этот пакет экономит ваше время или вы полагаетесь на него профессионально, рассмотрите возможность спонсировать поддержку и разработку и ознакомьтесь с нашим последним премиальным пакетом: Inertia Table. Отслеживание проблем и запросов на включение требует времени, но мы будем рады помочь!
Если вы хотите узнать больше об истории этого пакета, прочтите сообщение в блоге.
Вы можете установить пакет через композитор:
composer require protonemedia/laravel-cross-eloquent-search
get
был переименован в search
.addWhen
был удален в пользу метода when
.updated_at
. Если вы не используете временные метки, теперь по умолчанию будет использоваться первичный ключ. startWithWildcard
был переименован в beginWithWildcard
.getUpdatedAtColumn
. Раньше он был жестко запрограммирован в updated_at
. Вы по-прежнему можете использовать другой столбец для упорядочения.allowEmptySearchQuery
и класс EmptySearchQueryException
были удалены, но вы по-прежнему можете получать результаты без поиска. Начните свой поисковый запрос, добавив одну или несколько моделей для поиска. Вызовите метод add
указав имя класса модели и столбец, в котором вы хотите выполнить поиск. Затем вызовите метод search
с поисковым запросом, и вы получите экземпляр IlluminateDatabaseEloquentCollection
с результатами.
По умолчанию результаты сортируются по возрастанию обновленного столбца. В большинстве случаев этот столбец имеет updated_at
. Если вы настроили константу UPDATED_AT
своей модели или перезаписали метод getUpdatedAtColumn
, этот пакет будет использовать настроенный столбец. Если вы вообще не используете временные метки, по умолчанию будет использоваться первичный ключ. Конечно, вы можете заказать и другой столбец.
use ProtoneMedia LaravelCrossEloquentSearch Search ;
$ results = Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
Если вас волнуют отступы, вы можете дополнительно использовать new
метод на фасаде:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
Существует также метод when
для применения определенных предложений на основе другого условия:
Search :: new ()
-> when ( $ user -> isVerified (), fn( $ search ) => $ search -> add ( Post ::class, ' title ' ))
-> when ( $ user -> isAdmin (), fn( $ search ) => $ search -> add ( Video ::class, ' title ' ))
-> search ( ' howto ' );
По умолчанию мы разделяем поисковый запрос, и каждому ключевому слову будет присвоен подстановочный знак для частичного соответствия. На практике это означает, что поисковый запрос apple ios
приведет к apple%
и ios%
. Если вы также хотите, чтобы с подстановочного знака начинался, вы можете вызвать метод beginWithWildcard
. Это приведет к появлению %apple%
и %ios%
.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> search ( ' os ' );
Примечание. В предыдущих версиях этого пакета этот метод назывался startWithWildcard()
.
Если вы хотите отключить поведение, при котором к условиям добавляется подстановочный знак, вам следует вызвать метод endWithWildcard
с false
:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> endWithWildcard ( false )
-> search ( ' os ' );
Поиск по нескольким словам поддерживается «из коробки». Просто заключите фразу в двойные кавычки.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' "macos big sur" ' );
Вы можете отключить анализ поискового запроса, вызвав метод dontParseTerm
, который дает те же результаты, что и использование двойных кавычек.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> dontParseTerm ()
-> search ( ' macos big sur ' );
Если вы хотите отсортировать результаты по другому столбцу, вы можете передать этот столбец методу add
в качестве третьего параметра. Вызовите метод orderByDesc
чтобы отсортировать результаты в порядке убывания.
Search :: add ( Post ::class, ' title ' , ' published_at ' )
-> add ( Video ::class, ' title ' , ' released_at ' )
-> orderByDesc ()
-> search ( ' learn ' );
Вы можете вызвать метод orderByRelevance
, чтобы отсортировать результаты по количеству вхождений поисковых запросов. Представьте себе эти два предложения:
Если вы ищете Apple iPad , второе предложение появится первым, так как есть больше совпадений с условиями поиска.
Search :: add ( Post ::class, ' title ' )
-> beginWithWildcard ()
-> orderByRelevance ()
-> search ( ' Apple iPad ' );
Упорядочение по релевантности не поддерживается, если вы ищете по (вложенным) связям.
Чтобы отсортировать результаты по типу модели, вы можете использовать метод orderByModel
, задав ему предпочтительный порядок моделей:
Search :: new ()
-> add ( Comment ::class, [ ' body ' ])
-> add ( Post ::class, [ ' title ' ])
-> add ( Video ::class, [ ' title ' , ' description ' ])
-> orderByModel ([
Post ::class, Video ::class, Comment ::class,
])
-> search ( ' Artisan School ' );
Мы настоятельно рекомендуем разбивать результаты на страницы. Вызовите метод paginate
перед методом search
, и в результате вы получите экземпляр IlluminateContractsPaginationLengthAwarePaginator
. Метод paginate
принимает три (необязательных) параметра для настройки разбиения на страницы. Эти аргументы такие же, как и для разбиения на страницы базы данных Laravel.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> paginate ()
// or
-> paginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
Вы также можете использовать простую нумерацию страниц. Это вернет экземпляр IlluminateContractsPaginationPaginator
, который не учитывает длину:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> simplePaginate ()
// or
-> simplePaginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
Вместо имени класса вы также можете передать в метод add
экземпляр построителя запросов Eloquent. Это позволяет добавлять ограничения к каждой модели.
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> search ( ' compile ' );
Вы можете выполнять поиск по нескольким столбцам, передав массив столбцов в качестве второго аргумента.
Search :: add ( Post ::class, [ ' title ' , ' body ' ])
-> add ( Video ::class, [ ' title ' , ' subtitle ' ])
-> search ( ' eloquent ' );
Вы можете выполнять поиск по (вложенным) отношениям, используя точечную запись:
Search :: add ( Post ::class, [ ' comments.body ' ])
-> add ( Video ::class, [ ' posts.user.biography ' ])
-> search ( ' solution ' );
Вы можете использовать полнотекстовый поиск MySQL, используя метод addFullText
. Вы можете выполнять поиск по одному или нескольким столбцам (с использованием полнотекстовых индексов), а также указать набор параметров, например, для указания режима. Вы даже можете совмещать обычный и полнотекстовый поиск в одном запросе:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> addFullText ( Video ::class, ' title ' , [ ' mode ' => ' boolean ' ])
-> addFullText ( Blog ::class, [ ' title ' , ' subtitle ' , ' body ' ], [ ' mode ' => ' boolean ' ])
-> search ( ' framework -css ' );
Если вы хотите выполнить поиск по связям, вам необходимо передать массив, где ключ массива содержит отношение, а значение представляет собой массив столбцов:
Search :: new ()
-> addFullText ( Page ::class, [
' posts ' => [ ' title ' , ' body ' ],
' sections ' => [ ' title ' , ' subtitle ' , ' body ' ],
])
-> search ( ' framework -css ' );
MySQL имеет встроенный алгоритм soundex , поэтому вы можете искать термины, которые звучат почти одинаково. Вы можете использовать эту функцию, вызвав метод soundsLike
:
Search :: new ()
-> add ( Post ::class, ' framework ' )
-> add ( Video ::class, ' framework ' )
-> soundsLike ()
-> search ( ' larafel ' );
Здесь особо нечего объяснять, но это тоже поддерживается :)
Search :: add ( Post :: with ( ' comments ' ), ' title ' )
-> add ( Video :: with ( ' likes ' ), ' title ' )
-> search ( ' guitar ' );
Вы вызываете метод search
без термина или с пустым термином. В этом случае вы можете отбросить второй аргумент метода add
. С помощью метода orderBy
вы можете установить столбец для сортировки (ранее это был третий аргумент):
Search :: add ( Post ::class)
-> orderBy ( ' published_at ' )
-> add ( Video ::class)
-> orderBy ( ' released_at ' )
-> search ();
Вы можете подсчитать количество результатов с помощью метода count
:
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> count ( ' compile ' );
Вы можете использовать includeModelType
, чтобы добавить тип модели в результат поиска.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> includeModelType ()
-> paginate ()
-> search ( ' foo ' );
// Example result with model identifier.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " Post " ,
},
{
"id": 1 ,
"title": "foo",
"subtitle": null ,
"published_at": null ,
"created_at": " 2021-12-03T09:39:10.000000Z " ,
" updated_at ": " 2021 - 12 - 03 T09 : 39 : 10.000000 Z ",
" type ": " Video ",
},
],
...
}
По умолчанию он использует ключ type
, но вы можете настроить его, передав ключ методу.
Вы также можете настроить значение type
, добавив в свою модель общедоступный метод searchType()
чтобы переопределить базовое имя класса по умолчанию.
class Video extends Model
{
public function searchType ()
{
return ' awesome_video ' ;
}
}
// Example result with searchType() method.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " awesome_video " ,
}
],
...
Вы можете использовать парсер с методом parseTerms
:
$ terms = Search :: parseTerms ( ' drums guitar ' );
Вы также можете передать обратный вызов в качестве второго аргумента для прохода по каждому термину:
Search :: parseTerms ( ' drums guitar ' , function ( $ term , $ key ) {
//
});
composer test
Пожалуйста, посетите CHANGELOG для получения дополнительной информации о том, что изменилось за последнее время.
Пожалуйста, смотрите ВКЛАД для получения подробной информации.
Inertia Table
: идеальная таблица для Inertia.js со встроенным построителем запросов.Laravel Blade On Demand
: пакет Laravel для компиляции шаблонов Blade в памяти.Laravel Eloquent Scope as Select
: прекратите дублировать области и ограничения запросов Eloquent в PHP. Этот пакет позволяет повторно использовать области и ограничения запроса, добавляя их в качестве подзапроса.Laravel FFMpeg
: этот пакет обеспечивает интеграцию с FFmpeg для Laravel. Хранение файлов осуществляется файловой системой Laravel.Laravel MinIO Testing Tools
: запускайте тесты на сервере MinIO S3.Laravel Mixins
: коллекция вкусностей Laravel.Laravel Paddle
: интеграция API Paddle.com для Laravel с поддержкой веб-перехватчиков/событий.Laravel Task Runner
: пишите сценарии Shell, такие как Blade Components, и запускайте их локально или на удаленном сервере.Laravel Verify New Email
: этот пакет добавляет поддержку проверки новых адресов электронной почты: когда пользователь обновляет свой адрес электронной почты, он не заменяет старый, пока не будет проверен новый.Laravel XSS Protection
: промежуточное программное обеспечение Laravel для защиты вашего приложения от межсайтового скриптинга (XSS). Он очищает ввод запроса и может очищать операторы эха Blade.Если вы обнаружите какие-либо проблемы, связанные с безопасностью, отправьте электронное письмо по адресу [email protected] вместо использования системы отслеживания проблем.
Лицензия MIT (MIT). Дополнительную информацию см. в файле лицензии.
Этот пакет представляет собой Treeware. Если вы используете его в производстве, мы просим вас купить миру дерево в знак благодарности нам за нашу работу. Внося свой вклад в лес Treeware, вы создадите рабочие места для местных семей и восстановите среду обитания диких животных.