2014-10-01 1 views
2

Мне нужно сохранить базу данных архива в приложении в Symfony2. В нем я буду хранить все записи старше 90 дней. Я думал, что могу использовать только один менеджер сущностей (потому что обе базы данных идентичны).Работа с 2 базами данных и только один менеджер объектов в Symfony2

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

Прошу прощения, если это глупый вопрос, но я искал для него какое-то решение в течение 2 дней.

+0

В принципе вы не можете использовать две базы данных и один менеджер. – Cerad

ответ

1

Это невозможно, каждый менеджер Entity Manager может использовать только одно соединение DB, the docs seem quite clear about it.

Так что я думаю, что вы застряли с использованием двух ЭМ. Каждый из них будет настроен с дублированным набором ваших сопоставлений. Подробно о том, как вы используете их до вас, хотя:

  • Вы можете просто вручную выбрать одну или другую сторону, как требуется в приложении
  • Вы могли бы как-то абстрактный его прочь в класс свой собственный, который имеет оба EM, а затем, когда вы запускаете запросы и т. д., вы будете беспокоиться о том, откуда взять данные (и, возможно, как объединить данные из обоих EM)
  • Если единственной деятельностью, которая действительно нужна обе ЭМ, является сам процесс архивации, это очевидная вещь, чтобы спрятаться в классе красиво

Я полагаю, это также зависит от того, какая точка архивной БД. Если это какая-то архитектурная вещь, как будто она должна быть на другом сервере или что-то еще, тогда вы застряли, как указано выше. С другой стороны, если вы действительно хотите, чтобы старые данные не отображались в повседневных запросах (без специального запроса), тогда было бы лучше реализовать какой-то «архивный» флаг и расширение доктрины, которое магически скрывает заархивированные объекты, пока вы их не попросите, очень похоже на SoftDeleteable

+0

Что касается документации, я прочитал ее несколько раз, прежде чем беспокоить вас вопросом. Тем не менее мне не показалось, что я не могу работать. И @musaya сказала, что это может сработать (это работает для него). В любом случае, ваше решение выглядит неплохо для моей проблемы, и я ценю это. Спасибо за помощь. –

1

Я не знаю, является ли это хорошей практикой, но я успешно использовал один EM для двух баз данных в Symfony2. В проекте я работал над необходимым доступом к двум базам данных. Однако есть некоторые ограничения. Сначала для обеих баз данных должны быть одинаковыми параметры database_user и _password. Вы можете получить доступ к обеим базам данных, но вы можете создавать (с помощью доктрины консоли: database: create) и записывать таблицы (console doctrine: schema: update) той, которая определена в параметрах.yml. Вы можете читать, писать, обновлять, удалять на обеих базах данных, но вы должны указать имя базы данных ваших второй базы данных в модели, как:

@ORM\Table(name="my_other_database.my_table") 

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

+0

Это кажется интересным! Не думайте, что это будет работать на случай использования вопросника: каждая база данных содержит полный набор тех же таблиц, вы не можете поместить некоторые из них в один БД, а некоторые в другой, это строки, которые сделаны отдельными. Вы могли бы дублировать все свои сущности, но это звучит немного сумасшедшим ... – frumious

+0

Кажется, очень приятно. Я действительно думаю, что нашел более подходящее решение для моего дела в Doctrine Extension (@frumious ответ), но спасибо за вашу помощь ... –

2

Мы используем различные em для сохранения истории, отлично работает. Код выглядит следующим образом.

Где в вашей конфигурации ...

yourpath \ приложение \ Config \ parameters.yml

parameters: 
    database_driver: pdo_mysql 
    database_host: site1.ru 
    database_port: 3346 
    database_name: db1 
    database_user: roof 
    database_password: jump 

    database_history_driver: pdo_mysql 
    database_history_host: site2.ru 
    database_history_port: 10001 
    database_history_name: history 
    database_history_user: sea 
    database_history_password: deep 

    etc... 

Где в вашей истории пачке ...

/** 
* We make history! 
**/ 
class historyController extends Controller 
{ 
    public function showAction($historyId) 
    { 
     // get secondary manager 
     $emHistory = $this->getDoctrine()->getManager('history'); 
     // get default manager 
     $em = $this->getDoctrine()->getManager('default'); 
    } 
} 

Где в услугах истории пачке

class HistoryBundleUtils { 
    protected $em; 

    public function __construct($arguments) { 
     // get secondary manager 
     $this->em = $arguments['entityManager']->getManager('history'); 
     # etc... 
    } 
}