Upd. Исправлено в версии 5.0.10. Но пришлось обновиться сняв галочку "только стабильные версии"
Понадобилось поработать с другой БД (не битрикс).
В файле .settings.php добавил дополнительный коннект:
'connections' =>
array (
'value' =>
array (
'default' =>
array (
'className' => '\\Bitrix\\Main\\DB\\MysqlConnection',
'host' => 'localhost',
'database' => 'bx_basename',
'login' => 'bx_user',
'password' => 'bx_password',
'options' => 2,
),
'mybase' =>
array(
'className' => '\\Bitrix\\Main\\DB\\MysqlConnection',
'host' => 'localhost',
'database' => 'mybasename',
'login' => 'mybaseuser',
'password' => 'mybasepassword',
'options' => 2,
)
),
'readonly' => true,
|
сначала попробовал прямой запрос:
$connection = Bitrix\Main\Application::getConnection("mybase");
$sqlHelper = $connection->getSqlHelper();
$sql = "SELECT NOW()";
$recordset = $connection->query($sql);
|
запрос отработал, но выяснился первый косяк. На getConnection срабатывает скрипт bitrix/php_interface/after_connect_d7.php, но в нем содержится:
$connection = \Bitrix\Main\Application::getConnection();
$connection->queryExecute("SET NAMES 'utf8'");
$connection->queryExecute('SET collation_connection = "utf8_unicode_ci"');
|
т.е. он выполняется на дефолтной БД. В уже подключенной базе битрикса заново выполняются установки локали, а в БД mybase приходится устанавливать локаль вручную:
$connection = Bitrix\Main\Application::getConnection("mybase");
$connection->queryExecute("SET NAMES 'utf8'");
$connection->queryExecute('SET collation_connection = "utf8_unicode_ci"');
|
ну, это не беда, установил. На радостях решил работать со сторонней базой средствами ORM. Создал необходимые классы таблиц. Для коннекта со сторонней базой переопределил метод Entity\DataManager::getConnectionName() :
public static function getConnectionName()
{
return 'mybase';
}
|
пытаюсь выполнить getList() и получаю "Table 'bx_basename.mytable' doesn't exist (400)"
т.е. таблица не найдена в дефолтной базе.
Запустил трассировку и что же я вижу?
В bitrix/modules/main/lib/entity/query.php в функции buildQuery() опять же стоит
$connection = Main\Application::getConnection();
|
т.е. несмотря на переопределенный метод ORM в любом случае коннектится только к дефолтной базе!
Вопрос. Нафига тогда создавать методы для работы с другим соединением если все в итоге сведется к дефолтной БД?