Дата последнего изменения: 22.01.2024
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()”.