Эту задачу легче выполнить, чем вы думаете, и теоретически вы сможете использовать несколько баз данных за пару минут (если вы уже создали объекты). В этой статье вы научитесь:
- Подготовьте свои базы данных и создайте сущности самостоятельно в нужных вам пакетах (этот шаг будет пропущен в этой статье, поскольку вы можете реализовать это самостоятельно).
- Добавьте необходимую конфигурацию в файл 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 менеджера сущностей, в противном случае среда выполнения выдаст ошибку.
Повеселись