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