2013-02-19 2 views
0

Я установил соединение с несколькими базами данных в моем проекте ZF2 с помощью Doctrine, один для чтения из базы данных, а другой для записи.ZF2 doctrine shared entity pool

Все работает хорошо, когда используется отдельно, но когда я пытаюсь использовать как на одной и той же сущности, как:

найти пользователя:

$ пользователя = $ this->getReaderObjectManager() -> getRepository ('Entity \ User') -> findOneBy (массив ('username' => 'xpto'));

, а затем попытаться изменить что-то:

$ this->getWriterObjectManager() -> не проходят ($ пользователя); $ user-> setBlabla ('bla');

, а затем попытаться очистить его:

$ this->getWriterObjectManager() -> флеша();

nohin 'бывает. не хорошо.

Кажется, что readerObjectManager и writerObjectManager самостоятельном «сущности пул», поэтому я не могу сохраняться и изменить один объект от другого менеджера.

Есть ли способ передать объект от одного менеджера другому, или ссылаться на него, или просто, что оба менеджера имеют один и тот же «пул сущностей»?

благодарит заранее.

ответ

1

У вас не может быть управляемых объектов для нескольких менеджеров сущностей: это неподдерживается и может привести к неожиданному поведению.

Если вам действительно нужно отделить чтение от записи, сделайте это на уровне соединения с использованием подключения ведущего/ведомого или путем реализации вашего собственного объекта Doctrine\DBAL\Connection.

Кроме того, чтение, как правило, не обрабатывается с помощью ObjectManager, но с помощью ObjectRepository (где вы можете реализовать собственную стратегию в памяти для оптимизации операций чтения).

Другим способом обработки этого является отсоединить объекты от «чтения» ObjectManager и слить их обратно в «запись» ObjectManager.

Опять же, это не рекомендуется, и вы должны обращаться с ним на уровне соединения или с более разумной реализацией репозитория, который соответствует вашим потребностям.

+0

Можете ли вы объяснить немного больше, что вы имеете в виду «на уровне соединения»? – MGP

+0

Это означает, что объект соединения принимает решения о том, что обрабатывается с чтением и что с записью (обычно это происходит с средами master/slave). Если ваша проблема связана только с памятью PHP, используйте только очень интеллектуальный репозиторий. – Ocramius

+0

Единственная проблема - необходимость чтения с одного db и записи в другой (настройки рабочей среды). Итак, создание пользовательского DBALConnection - это путь? Или есть способ, которым я могу обойти стандартное соединение orm_default, изменяющее информацию о соединении «на лету» basead в действии insert/update и select? – MGP

Смежные вопросы