Это, строго говоря, не ответ, а скорее предложение.
Дело в том, что ваш хук получает $query
, уже построенный с исходным подключением к базе данных, это объясняетошибки.Чтобы быть эффективным, db_set_active()
должен вызываться перед вызовом конструктора запросов.
В противном случае вам придется переопределить конструкторы как для класса Select , так и для его родительского класса Query , или, точнее, "восстановить" экземпляр построителя запросов для операторов Select(и, возможно, другие, если вам нужен запрос диапазона и т. д.).
Кроме того, если нет явных требований для обеспечения выделенного хука в этой ситуации, в этом нет необходимости.
Например, было бы проще сделать что-то вроде этого:
connector.module :
/**
* Implements hook_init()
*
* Adds secondary database connection information.
*/
function connector_init() {
$database_info = array(
'database' => variable_get('connector_db_name'),
'username' => variable_get('connector_db_user'),
'password' => variable_get('connector_db_pwd'),
'host' => variable_get('connector_db_host'),
'driver' => 'mysql',
);
Database::addConnectionInfo('secondary_db', 'default', $database_info);
}
/**
* Switches from primary to secondary database and the other way round.
*/
function connector_switch_db($db_key = 'secondary_db') {
return db_set_active($db_key);
}
Пример:
// Set secondary db active.
$primary_db_key = connector_switch_db();
$query = db_select('registration')
->fields('registration')
->condition('id', 46, '=');
$result = $query->execute()->fetchAssoc();
// Switch back to the primary database.
connector_switch_db($primary_db_key);
Этот более мягкий подход также предотвращает использование жесткого кода, например (...)->execute()->fetchAssoc()
, и позволяет реализации свободно выполнять и извлекать результаты по мере необходимости.