Этот пакет добавляет функции поиска/фильтрации в модели Eloquent в Laravel 4/5/6.
Вы также можете найти эти пакеты полезными:
Добавьте следующую строку в файл composer.json
вашего проекта:
"jedrzej/searchable": "0.0.17"
или запустите следующую команду в командной строке в корневой папке вашего проекта:
composer require "jedrzej/searchable" "0.0.17"
Чтобы сделать модель Eloquent доступной для поиска, добавьте признак в модель и определите список полей, по которым модель можно фильтровать. Вы можете либо определить свойство $searchable, либо реализовать метод getSearchableAttributes, если хотите выполнить некоторую логику для определения списка полей, доступных для поиска.
use Jedrzej Searchable SearchableTrait ;
class Post extends Eloquent
{
use SearchableTrait ;
// either a property holding a list of searchable fields...
public $ searchable = [ ' title ' , ' forum_id ' , ' user_id ' , ' created_at ' ];
// ...or a method that returns a list of searchable fields
public function getSearchableAttributes ()
{
return [ ' title ' , ' forum_id ' , ' user_id ' , ' created_at ' ];
}
}
Чтобы сделать все поля доступными для поиска, поставьте звездочку * в списке полей, доступных для поиска:
public $ searchable = [ ' * ' ];
Также можно внести атрибуты модели в черный список, чтобы предотвратить ее фильтрацию.
Вы можете либо определить свойство $notSearchable, либо реализовать метод getNotSearchableAttributes, если хотите выполнить некоторую логику для определения списка полей, доступных для поиска.
use Jedrzej Searchable SearchableTrait ;
class Post extends Eloquent
{
use SearchableTrait ;
// either a property holding a list of not searchable fields...
public $ notSearchable = [ ' created_at ' ];
// ...or a method that returns a list of not searchable fields
public function getNotSearchableAttributes ()
{
return [ ' created_at ' ];
}
}
Если вы определите оба списка — столбцы с возможностью поиска и столбцы с возможностью поиска — результирующий набор полей с возможностью поиска будет содержать все атрибуты из белого списка, кроме всех атрибутов из черного списка.
SearchableTrait
добавляет в модель область действия filtered()
— вы можете передать ей запрос, представляющий собой массив условий фильтра:
// return all posts with forum_id equal to $forum_id
Post :: filtered ([ ' forum_id ' => $ forum_id ])-> get ();
// return all posts with with <operator> applied to forum_id
Post :: filtered ([ ' forum_id ' => <operator>])-> get ();
или он будет использовать Request::all()
по умолчанию:
// if you append ?forum_id=<operator> to the URL, you'll get all Posts with <operator> applied to forum_id
Post :: filtered ()-> get ();
Режим запроса по умолчанию заключается в применении соединения ( AND
) всех запросов к модели с возможностью поиска. Его можно изменить на дизъюнкцию ( OR
), установив значение параметра запроса mode
на or
. Если параметр запроса mode
уже используется, будет использоваться имя, возвращаемое методом getQueryMode
.
SearchableTrait
поддерживает следующие операторы:
Операторы сравнения позволяют осуществлять фильтрацию на основе результата сравнения атрибута модели и значения запроса. Они работают со строками, числами и датами. Они имеют следующий формат:
(<operator>)<value>
Доступны следующие операторы сравнения:
gt
greater than
сравнениеge
для сравнения greater than or equal
lt
less than
сравнение, напримерle
для les than or equal
сравненияЧтобы отфильтровать сообщения 2015 года и новее, следует использовать следующий запрос:
?created_at=(ge)2015-01-01
Признак с возможностью поиска позволяет фильтровать по точному значению атрибута или по набору значений, в зависимости от типа значения, переданного в качестве параметра запроса. Если значение содержит запятые, параметр разбивается на запятые и используется как входной массив для фильтрации IN
, в противном случае применяется точное совпадение.
Чтобы отфильтровать сообщения от пользователя с идентификатором 42, необходимо использовать следующий запрос:
?user_id=42
Чтобы отфильтровать сообщения с форумов с идентификатором 7 или 8, необходимо использовать следующий запрос:
?forum_id=7,8
Операторы Like позволяют фильтровать с помощью запроса LIKE
. Этот оператор срабатывает, если используется оператор точного соответствия, но значение содержит знак %
в качестве первого или последнего символа.
Чтобы отфильтровать сообщения, начинающиеся с How
, следует использовать следующий запрос:
?title=How%
Notice:
символ процента используется для кодирования специальных символов в URL-адресах, поэтому при отправке запроса убедитесь, что используемые вами инструменты правильно encode the % character as %25
Оператор Null (null)
позволяет фильтровать модели, атрибут которых имеет значение null.
Чтобы отфильтровать сообщения без вложений, следует использовать следующий запрос:
?attachment_id=(null)
Можно получить отрицательные результаты запроса, добавив к оператору !
.
Несколько примеров:
//filter posts from all forums except those with id 7 or 8
?forum_id=!7,8
//filter posts older than 2015
?created_at=!(ge)2015
//filter posts with attachment
?attachment_id=!(null)
К атрибуту одной модели можно применить несколько ограничений. Для этого предоставьте массив фильтров запросов вместо одного фильтра:
// filter all posts from year 20** except 2013
?created_at[]=20%&created_at[]=!2013%
Возможна фильтрация по атрибутам отношений модели - будет применен Eloquent'swhereHas whereHas()
. Чтобы выполнить фильтрацию по отношению, добавьте атрибут отношения в список полей, searchable
в форме relation:attribute
. Ту же строку следует использовать в запросе для фильтрации по атрибуту этого отношения, например:
// allow filtering on user's active field
protected $searchable = ['user:active'];
// filter only posts of active users
?user:active=1
Также возможно отменить поиск и фильтрацию объектов, которые не имеют отношения соответствия, применив Eloquent'swhereDoesntHave whereDoesntHave()
. Для этого добавьте к имени отношения префикс !
:
// allow filtering on comment's approved field
protected $searchable = ['comments:approved'];
// filter only posts that have approved comments
?comments:approved=1
// filter only posts that have not-approved comments
?comments:approved=1
// filter only posts that do not have approved comments
?!comments:approved=1
Если вы хотите фильтровать по вложенному отношению, просто укажите имя вложенного отношения, заменяя точку двоеточием. Это необходимо, поскольку PHP автоматически заменяет точки в URL-адресе подчеркиванием.
// filter only posts that have comments from active authors
?comments:author:active=1
Выбранные фильтры можно обрабатывать по собственной логике, например, когда имя фильтра не соответствует имени атрибута, используемого для фильтрации, или если необходимо выполнить какие-то пользовательские операции. Чтобы переопределить логику фильтра xyz
, вам необходимо определить в вашей модели метод processXyzFilter
названиемprocessXyzFilter. Этот метод должен возвращать true
, если фильтр обработан и логика по умолчанию больше не должна выполняться.
// use one filter to search in multiple columns
protected function processNameFilter ( Builder $ builder , Constraint $ constraint )
{
// this logic should happen for LIKE/EQUAL operators only
if ( $ constraint -> getOperator () === Constraint :: OPERATOR_LIKE || $ constraint -> getOperator () === Constraint :: OPERATOR_EQUAL ) {
$ builder -> where ( function ( $ query ) use ( $ constraint ) {
$ query -> where ( ' first_name ' , $ constraint -> getOperator (), $ constraint -> getValue ())
-> orWhere ( ' last_name ' , $ constraint -> getOperator (), $ constraint -> getValue ());
});
return true ;
}
// default logic should be executed otherwise
return false ;
}
Чтобы переопределить фильтр для поиска отношений, замените двоеточие в имени фильтра на подчеркивание. Если вы хотите переопределить логику для user:active
, вам нужно будет определить processUser_ActiveFilter
.