Как использовать более одной базы данных, используя доктрину в Symfony 3

Эту задачу легче выполнить, чем вы думаете, и теоретически вы сможете использовать несколько баз данных за пару минут (если вы уже создали объекты). В этой статье вы научитесь:

  • Подготовьте свои базы данных и создайте сущности самостоятельно в нужных вам пакетах (этот шаг будет пропущен в этой статье, поскольку вы можете реализовать это самостоятельно).
  • Добавьте необходимую конфигурацию в файл config.yml в вашем проекте
  • Узнайте, как обновить и создать схему с помощью консоли Symfony

Подключение к базам данных

В этом случае мы используем 2 базы данных, по умолчанию (ourcodeworld) и аналитику (аналитика), поэтому нам необходимо зарегистрировать эти изменения в нашем проекте. Перейти к config.yml файл и измените следующую конфигурацию в свойстве doctrine:

doctrine:
# Configure the abstraction layer
dbal:
# Set the default connection to default
default_connection: default
connections:
default:
driver:   '%default_driver%'
host:     '%default_host%'
port:     '%default_port%'
dbname:   '%default_name%'
user:     '%default_user%'
password: '%default_password%'
charset:  UTF8
analytics:
driver:   '%analytics_driver%'
host:     '%analytics_host%'
port:     '%analytics_port%'
dbname:   '%analytics_name%'
user:     '%analytics_user%'
password: '%analytics_password%'
charset:  UTF8
# Configure the ORM
orm:
default_entity_manager: default
entity_managers:
# Register which bundle should use which connection
default:
connection: default
mappings:
AppBundle:  ~
AnalyticsBundle: ~
analytics:
connection: analytics
mappings:
AnalyticsBundle: ~

Убедитесь, что если ваша база данных использует учетные данные, они совпадают с данными учетных данных в предыдущей конфигурации, чтобы предотвратить любую странную ошибку. До этого момента конфигурации достаточно.

Также будьте осторожны с любой существующей конфигурацией, например, если ваш проект уже использует, например, расширения dql (пользовательские функции, например, match_against), эти настройки необходимо изменить по сравнению с глобальными настройками dbal (блок orm) и добавить их в каждый менеджер пользовательских сущностей , В противном случае вы получите такие ошибки, как Нераспознанные параметры «naming_strategy, auto_mapping, dql» в разделе «doctrine.orm».

Смотрите следующий пример только для уже существующего проекта :

# Doctrine Configuration
doctrine:
dbal:
# Set the default connection to default
default_connection: default
connections:
default:
driver:   'pdo_mysql'
host:     '127.0.0.1'
port:     null
dbname:   'ourcodeworld'
user:     'root'
password: null
charset:  UTF8
analytics:
driver:   'pdo_mysql'
host:     '127.0.0.1'
port:     null
dbname:   'analytics'
user:     'root'
password: null
charset:  UTF8
orm:
auto_generate_proxy_classes: "%kernel.debug%"
default_entity_manager: default
entity_managers:
# Register which bundle should use which connection
default:
naming_strategy: doctrine.orm.naming_strategy.underscore
connection: default
auto_mapping: true
mappings:
AppBundle:  ~
dql:
string_functions:
MATCH_AGAINST: ourcodeworld\Extensions\Doctrine\MatchAgainst
analytics:
naming_strategy: doctrine.orm.naming_strategy.underscore
connection: analytics
mappings:
AnalyticsBundle: ~
dql:
string_functions:
MATCH_AGAINST: ourcodeworld\Extensions\Doctrine\MatchAgainst

Теперь, когда наша базовая конфигурация готова, вам нужно только научиться использовать диспетчер сущностей с несколькими соединениями на ваших контроллерах. Вы сможете манипулировать всем, как и всегда, только вам нужно указать, какое соединение вы хотите использовать, указав строку в качестве первого параметра с именем соединения на getManager функция.

class AnyofMyController extends Controller
{
public function anyAction()
{
// All three return the "default" entity manager
$em = $this->get('doctrine')->getManager();
$em = $this->get('doctrine')->getManager('default');
$em = $this->get('doctrine.orm.default_entity_manager');
// Both of these return the "analytics" entity manager
$analyticsEm = $this->get('doctrine')->getManager('analytics');
$analyticsEm = $this->get('doctrine.orm.analytics_entity_manager');
$analyticItem = $analyticsEm->getRepository("analyticsBundle:Analytics")->find(12);// Find an analytics item
}
}

Обратите внимание, что в этой статье предполагается, что вы будете выполнять все настройки вашей базы данных (создание базы данных и сопоставление сущностей).

Обновление и создание схемы доктрины

Поскольку вы работаете с несколькими базами данных, при работе с такими командами, как doctrine:database:create а также doctrine:schema:update вам нужно указывать при каждом выполнении, с каким соединением вы хотите выполнить эту задачу, например:

# Play only with "default" connection
$ php bin/console doctrine:database:create
# Play only with "analytics" connection
$ php bin/console doctrine:database:create --connection=analytics

И чтобы обновить любую схему, используйте:

# Play only with "default" mappings
$ php bin/console doctrine:schema:update --force
# Play only with "analytics" mappings
$ php bin/console doctrine:schema:update --force --em=analytics

Окончательные рекомендации

  • Эта задача немного сложнее, чем создание обычного соединения с базой данных по умолчанию в Symfony, и обычно не требуется. Убедитесь, что вам действительно нужно несколько менеджеров сущностей, прежде чем добавлять на этот уровень сложности (внешние ключи, предназначенные для существующей базы данных и т. Д.).
  • Если вы опускаете имя менеджера сущностей при запросе его, возвращается менеджер сущностей по умолчанию (например, по умолчанию).
  • Помни что auto_mapping опция может быть включена только для 1 менеджера сущностей, в противном случае среда выполнения выдаст ошибку.

Повеселись

Ссылка на основную публикацию
Adblock
detector