Выбор данных из хранимых процедур вместо таблиц
Тему урока можно изучить в новом формате — в документации по Bitrix Framework. В ней улучшена структура, описание, примеры.
ORM подходит даже для таких экзотических запросов, как выборка данных не из таблицы, а из хранимых процедур. Такие процедуры могут быть созданы в MSSQL-базе данных.
Укажем название функции в методе getTableName:
public static function getTableName()
{
// return "foo_table_name"
return "foo_table_procedure()";
}
В этом виде такой код работать не будет. Дело в том, что при использовании подключения Bitrix\Main\DB\MssqlConnection все вхождения имен таблиц проходят через экранирование. Попытка сразу выполнить такой запрос приведет к выбрасыванию исключения:
MS Sql query error: Invalid object name 'foo_table_procedure()'. (400)
SELECT
[base].[bar] AS [BAR],
[base].[baz] AS [BAZ],
FROM [foo_table_procedure()] [base]
Получению нужного результата мешают только знаки [ и ], которыми MssqlSqlHelper защитил имя "таблицы". Проблема решается созданием собственного подключения Connection и SqlHelper.
Вариант решения: на сервер установите расширение mssql и реализуйте следующую архитектуру:
class MssqlSqlHelper extends Bitrix\Main\DB\SqlHelper
{
public function quote($identifier)
{
if (self::isKnowFunctionalCall($identifier))
{
return $identifier
}
else
{
return parent::quote($identifier);
}
}
}
Где self::isKnownFunctionCall - метод проверки, который возвращает true, если в $identifier находится “foo_table_procedure()”.
Примечание: Пример разработан компанией Интерволга.