Множественные подключения

Idiorm теперь работает со множественными подключениями. Большинство статических функций работают с опциональным именем соединения в качестве дополнительного параметра. Касательно метода ORM::configure, это означает, что при передаче строки соединения для установки нового соединения, второй параметр, который обычно опускается, должен быть равен null. Во всех случаях, если имя соединения не предоставлено, то оно примет значение по-умолчанию ORM::DEFAULT_CONNECTION.

При составлении цепочки, как только метод for_table() был использован, оставшиеся вызовы в цепочке будут использовать корректное соединение.

<?php
// Соединение по-умолчанию
ORM::configure('sqlite:./example.db');

// Именованное соединение, где 'remote' произвольное имя ключа
ORM::configure('mysql:host=localhost;dbname=my_database', null, 'remote');
ORM::configure('username', 'database_user', 'remote');
ORM::configure('password', 'top_secret', 'remote');

// Используя соединение по-умолчанию
$person = ORM::for_table('person')->find_one(5);

// Используя соединение по-умолчанию явным образом
$person = ORM::for_table('person', ORM::DEFAULT_CONNECTION)->find_one(5);

// Используя именованное соединение
$person = ORM::for_table('different_person', 'remote')->find_one(5);

Поддерживаемые методы

В каждом из этих случаев, параметр $connection_name необязательный, и является произвольным ключем, идентифицирующим название соединения.

  • ORM::configure($key, $value, $connection_name)
  • ORM::for_table($table_name, $connection_name)
  • ORM::set_db($pdo, $connection_name)
  • ORM::get_db($connection_name)
  • ORM::raw_execute($query, $parameters, $connection_name)
  • ORM::get_last_query($connection_name)
  • ORM::get_query_log($connection_name)

Среди этих методов, только ORM::get_last_query($connection_name) не использует соединение по-умолчанию, если не передано название подключения. Вместо этого, если не передавать название подключения (или значение null) то метод вернет самый последний запрос любого соединения.

<?php
// Используя соединение по-умолчанию явным образом
$person = ORM::for_table('person')->find_one(5);

// Используя именованное подключение
$person = ORM::for_table('different_person', 'remote')->find_one(5);

// Последний запрос *любого* соединения
ORM::get_last_query(); // вернет запрос в 'different_person' используя имя 'remote'

// Вернет запрос 'person' используя переданную строку соединения из настроек по-умолчанию
ORM::get_last_query(ORM::DEFAULT_CONNECTION);

Примечания

  • Нет поддержки объединений (join) по подключениям
  • Множественные подключения не делятся настройками конфигурации. Это означает, что если у одного соединения параметр логов имеет значение true а у другого нет, то только запросы из соединения со включенным логом будут доступны для методов ORM::get_last_query() и ORM::get_query_log().
  • Был добавлен новый метод, ORM::get_connection_names(), возвращающий массив с именами соединений.
  • Кэширование должно работать со множеством соединений (не забудьте включить кеширование для каждого соединения), однако это не надежно в отношении unit-тестирования. Пожалуйста, сообщайте об ошибках.