Когда требуется подключиться и подтянуть данные из не основной базы, то нужно сначала задать свойства нового подключения, подключиться, выполнить запрос, а затем вернуть настройки в исходное состояние. Рассмотрим примеры кода, которые демонстрируют как это сделать.
Подключение к другой базе
Задать параметры подключения можно через файл конфигурации сайта (дополнительно к настройкам основной базы). К примеру, пусть это будет подключение к mysql базе:
1 2 3 4 5 6 7 8 9 10 |
$databases[<CONNECTION-KEY>][<DATABASE-KEY>] = array( 'database' => 'db_name', 'username' => 'db_username', 'password' => 'db_password', 'prefix' => '', 'host' => 'localhost', 'port' => '3306', 'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql', 'driver' => 'mysql', ); |
Вам нужно придумать уникальное название для вашего подключения — <CONNECTION-KEY> и обычно вы указываете <DATABASE-KEY> — как ‘default’, если у вас всего одна база данных.
Классом-контейнером для нужных нам операций является класс Drupal\Core\Database\Database.
1 |
use Drupal\Core\Database\Database; |
В коде вы получаете объект подключения к базе следующим образом:
1 2 |
Database::setActiveConnection(<CONNECTION-KEY>); $db = Database::getConnection(); |
Настройки подключения можно задать и напрямую из вашего кода:
1 2 3 4 5 6 7 8 9 10 11 12 |
$database = array( 'database' => 'db_name', 'username' => 'db_username', 'password' => 'db_password', 'host' => 'localhost', 'driver' => 'mysql', 'port' => '3306', 'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql' ); Database::addConnectionInfo(<CONNECTION-KEY>, 'default', $database); Database::setActiveConnection(<CONNECTION-KEY>); $db = Database::getConnection(); |
Операции с базой
Получив соединение, вы можете выполнять операции с базой данных. В примере, я пытаюсь получить данные из таблицы users:
1 2 3 4 5 6 7 8 9 10 |
$query = $db->select('users', 'u'); $query->fields('u', ['uid']); try { $users = $query->execute()->fetchAssoc(); } catch(\Drupal\Core\Database\DatabaseExceptionWrapper $execute) { $users = []; } catch(Exception $e) { $users = []; } |
Обратите внимание на обработку исключений, простейший пример которой приведен выше.
Переключение на основную базу
Далее вам требуется вернуться к основным настройкам и продолжить работу с основной базой.
1 2 3 |
Database::setActiveConnection('default'); $query = \Drupal::database()->select('users', 'u'); ... |
По сути это не обязательно, т.к. \Drupal::database() — это и есть основной ваш объект подключения к базе, но если далее в программе какие то модули запрашивают Database::getConnection(), то скорее всего им нужна не ваша «левая» база.