0

Doctrineを使用してZF2プロジェクトにマルチデータベース接続をセットアップしました。1つはデータベースから読み取り、もう1つは書き込みを行います。

別々に使用するとすべてがうまく機能しますが、同じエンティティで両方を使用しようとすると、次のようになります。

ユーザーを見つける:

$ user = $ this-> getReaderObjectManager()-> getRepository('Entity \ User')-> findOneBy(array('username' =>'xpto'));

次に、何かを変更してみます。

$ this-> getWriterObjectManager()-> persist($ user); $ user-> setBlabla('bla');

そしてそれをフラッシュしてみてください:

$ this-> getWriterObjectManager()-> flush();

nothin'が発生します。ダメ。

readerObjectManagerとwriterObjectManagerには独立した「エンティティプール」があるようです。そのため、一方のエンティティをもう一方のマネージャーから永続化して変更することはできません。

あるマネージャーから別のマネージャーにエンティティを渡す方法、参照する方法、または両方のマネージャーが同じ「エンティティプール」を共有する単純な方法はありますか?

前もって感謝します。

4

1 に答える 1

1

複数のエンティティマネージャー間でエンティティを管理することはできません。これはサポートされておらず、予期しない動作を引き起こす可能性があります。

読み取りと書き込みを本当に分離する必要がある場合は、マスター/スレーブ接続を使用するか、独自のDoctrine\DBAL\Connectionオブジェクトを実装することにより、接続レベルで分離します。

また、読み取りは通常、を介して処理されるのObjectManagerではなく、ObjectRepository(読み取り操作を最適化するためのカスタムメモリ内戦略を実装できる)によって処理されます。

これを処理する別の方法は、エンティティを「読み取り」から切り離し、ObjectManagerそれらを「書き込み」にマージすることObjectManagerです。

繰り返しになりますが、これは推奨されていません。接続レベルで、またはニーズに合ったリポジトリのよりスマートな実装で処理する必要があります。

于 2013-02-19T17:31:20.990 に答える