Подключение к нескольким базам данных в Doctrine2 и Zend framework

В настоящее время я работаю над приложением, созданным с использованием ZF 1.11.3. Doctrine2 — это используемый компонент ORM. Мне нужно использовать несколько баз данных. В файле application.ini я установил соединения с базой данных следующим образом:

resources.doctrine.dbal.connections.default.parameters.dbname   = "db_name_one"
resources.doctrine.dbal.connections.secondary.parameters.dbname   = "db_name_two"

Как мне связать классы сущностей Doctrine2 на основе второго соединения с базой данных с этим соединением: например, если у меня есть класс сущностей из второго соединения как:

/*
   * @Entity
   * @Table(name="tableOnSecondDatabase")
   */
  Class EntityFromSecond
  {

Как Doctrine2/ZF узнает, какие классы сущностей сопоставлены с базой данных? Спасибо за помощь.


person pi.    schedule 26.03.2011    source источник
comment
re: ваш предыдущий флаг: StackOverflow не является форумом; ответы должны быть ответами. Если бы вы прочитали faq, вы бы поняли, что добавление ответа, по сути, у меня такая же проблема, если бы вы нашли исправление здесь не приемлемо. Такие ответы сразу удаляются. Пожалуйста, не делай этого снова. Спасибо.   -  person    schedule 28.03.2011


Ответы (2)


Я не думаю, что вы можете привязать объект к конкретному соединению, это не имеет смысла в архитектуре Doctrine 2.

Что вы можете сделать, с другой стороны, так это иметь два EntityManager, каждый с разными вариантами подключения. Вы должны решить в своей бизнес-логике, какая сущность обрабатывается каким диспетчером соединений.

редактировать Doctrine 2 не поддерживает соединения между базами данных в том смысле, что существует два отдельных соединения и соединение между ними, насколько мне известно. Я даже не представляю, как это будет работать на уровне PHP PDO. То, что Виджай предложил для одного, основанного на Doctrine 1, и второе, это не совсем соединение между базами данных, поскольку Doctrine 1 выполняет 2 запроса и сам объединяет результаты, что не является оптимальным с точки зрения производительности.

Что вы могли бы сделать, с другой стороны, так это иметь одно соединение, которое может получить доступ к обеим базам данных (то есть, если они находятся на одном сервере БД) или схемам, если вы, скажем, на Postgres, и определить свой сущности как таковые:

//defining first entity
@Entity
@Table(firstSchema.table_name)
class MyEntity

//defining second entity

@Entity
@Table(secondSchema.table_name)
class SecondEntity

Это должно сработать, я считаю

person Tomáš Plešek    schedule 26.03.2011
comment
аш: Спасибо за ответ. Я думаю, что ваше предложение стоит попробовать. Однако мне интересно, может ли это решение (1 диспетчер сущностей на соединение) вызывать проблемы при работе с соединениями между базами данных. Не уверен, поддерживается ли это в настоящее время в Doctrine 2. Веб-документация, похоже, ничего не говорит об этом. Есть предположения? Спасибо. - person pi.; 26.03.2011
comment
просто чтобы уточнить, используя точечную нотацию (например, @Table(name=Dbname.TblName), могу ли я использовать соединения Doctrine? - person PachinSV; 04.07.2012

Если вы используете две разные базы данных для одного и того же приложения, и они независимо обслуживают разные модули в вашем приложении, вы можете выполнить инъекцию на уровне плагина и выбрать правильное соединение с базой данных в соответствии с запросом.

В следующей ссылке несколько баз данных обрабатываются с использованием отдельных соединений.

http://stuf.ro/using-multiple-databases-in-doctrine/

Если у вас есть связь между двумя базами данных и вам необходимо получить данные после объединения таблиц из двух из этих баз данных, вы можете создать класс сущности доктрины, указав dbName.tableName.columnName. Это будет немного сложно, но для дальнейшего ознакомления перейдите по следующей ссылке:

http://www.doctrine-project.org/blog/cross-database-joins

person Vijay    schedule 26.03.2011
comment
спасибо за ваш ответ, но ваши предложения (и ссылки), я считаю, НЕ для Doctrine 2, а для Doctrine 1.x. - person pi.; 27.03.2011