find
public static \Bitrix\Sale\Location\Search\Finder::find(
array $parameters,
array $behaviour = [
'FALLBACK_TO_NOINDEX_ON_NOTFOUND' => true,
'USE_INDEX' => true,
'USE_ORM' => true,
]
);
Статический метод ищет местоположения по параметрам, совместимым с \Bitrix\Sale\Location\LocationTable::getList(). Метод возвращает объект результата, из которого можно получать строки через fetch().
Параметры
| Параметр | Описание |
|---|---|
$parameters |
Массив параметров поиска.
|
$behaviour |
Настройки поведения поиска.
|
Возвращаемое значение
Возвращает объект результата, из которого можно получать строки методом fetch().
В зависимости от сценария метод может вернуть:
\Bitrix\Main\DB\Result,\Bitrix\Main\DB\ArrayResult,- результат
\Bitrix\Sale\Location\LocationTable::getList().
Как работает
Метод проверяет параметры поиска и добавляет select => ['ID'], если выборка не передана.
Если в фильтре есть PHRASE, =PHRASE, SITE_ID или =SITE_ID, метод использует поисковый механизм Finder. Такой же механизм применяется, если в поведении задано 'USE_ORM' => false.
Если специальных фильтров нет и ORM не отключен, метод передает параметры в \Bitrix\Sale\Location\LocationTable::getList().
Поиск через индекс
Метод использует индекс, если индекс помечен как актуальный и в поведении задано 'USE_INDEX' => true. Актуальность индекса проверяет Finder::checkIndexValid().
При поиске по индексу метод поддерживает:
- фильтр по
PHRASEили=PHRASE, - фильтр по
SITE_IDили=SITE_ID, - выборку и фильтр по простым полям
\Bitrix\Sale\Location\LocationTable, - выборку и фильтр по
NAME.NAMEиNAME.LANGUAGE_ID, limitиoffset.
Если индекс не вернул строки и в поведении задано 'FALLBACK_TO_NOINDEX_ON_NOTFOUND' => true, метод повторяет поиск без индекса.
Поиск без индекса
Без индекса метод строит SQL-запрос к таблицам местоположений, названий, типов и привязок к сайтам.
В этом режиме поддерживаются фильтры:
PHRASEили=PHRASE— начало названия местоположения,SITE_IDили=SITE_ID— идентификатор сайта,IDили=ID— идентификатор местоположения или массив идентификаторов,CODEили=CODE— код местоположения, при поиске без индекса код обрабатывается как числовое значение,COUNTRY_IDили=COUNTRY_ID— идентификатор страны,PARENT_IDили=PARENT_ID— идентификатор родительского местоположения,TYPE_IDили=TYPE_ID— идентификатор типа местоположения,NAME.LANGUAGE_IDили=NAME.LANGUAGE_ID— язык названия.
Если язык названия не передан, метод использует константу LANGUAGE_ID.
Исключения
Метод может выбросить исключение при некорректных параметрах:
$parametersдолжен быть массивом,$parameters['select']и$parameters['filter']должны быть массивами,PHRASE,SITE_IDи их варианты с оператором=должны быть строками,limitиoffsetдолжны быть неотрицательными целыми числами,- при поиске через механизм
Finderв фильтре поддерживается только оператор=.
Примеры
Перед использованием примеров подключите модуль sale:
if (!\Bitrix\Main\Loader::includeModule('sale'))
{
throw new \RuntimeException('Модуль sale не подключен');
}
Найти местоположения по началу названия:
$result = Bitrix\Sale\Location\Search\Finder::find([
'select' => [
'ID',
'CODE',
'NAME' => 'NAME.NAME',
],
'filter' => [
'=PHRASE' => 'Москва',
'=NAME.LANGUAGE_ID' => LANGUAGE_ID,
],
'limit' => 10,
]);
while ($location = $result->fetch())
{
echo $location['ID'] . ': ' . $location['NAME'] . PHP_EOL;
}
Найти только города:
$typeResult = \Bitrix\Sale\Location\TypeTable::getList([
'select' => [
'ID',
],
'filter' => [
'=CODE' => 'CITY',
],
'limit' => 1,
]);
$cityType = $typeResult->fetch();
if (!$cityType)
{
throw new \RuntimeException('Тип местоположения CITY не найден');
}
$result = \Bitrix\Sale\Location\Search\Finder::find([
'select' => [
'ID',
'CODE',
'NAME' => 'NAME.NAME',
],
'filter' => [
'=PHRASE' => 'Москва',
'=TYPE_ID' => (int)$cityType['ID'],
'=NAME.LANGUAGE_ID' => LANGUAGE_ID,
],
'limit' => 10,
]);
while ($location = $result->fetch())
{
echo $location['ID'] . ': ' . $location['NAME'] . PHP_EOL;
}
Выполнить поиск без индекса и ORM:
$result = Bitrix\Sale\Location\Search\Finder::find(
[
'select' => [
'ID',
'CODE',
'NAME' => 'NAME.NAME',
],
'filter' => [
'=PHRASE' => 'Санкт-Петербург',
'=NAME.LANGUAGE_ID' => 'ru',
],
'limit' => 5,
],
[
'USE_INDEX' => false,
'USE_ORM' => false,
]
);
while ($location = $result->fetch())
{
echo $location['ID'] . ': ' . $location['NAME'] . PHP_EOL;
}
Особенности
Символ % удаляется из значения PHRASE перед поиском.
Если передан SITE_ID, но для сайта не используются привязки местоположений, метод удаляет этот фильтр перед поиском.
Методы \Bitrix\Sale\Location\LocationTable::addExtended(), updateExtended() и deleteExtended() помечают индекс поиска как неактуальный после успешного изменения данных местоположений.
Метод \Bitrix\Sale\Location\LocationTable::getListFast() устарел и вызывает Finder::find() с отключенными индексом и ORM.