2011-10-24 14 views
14

symfony2とdoctrineを初めて使用しました。 ここに問題があります私は参照してください。 私は使用することはできません:持続、まだフラッシュされませんオブジェクト上読み取りオブジェクトは永続化されましたが、まだdoctrineでフラッシュされていません

$repository = $this->getDoctrine()->getRepository('entity'); 
$my_object = $repository->findOneBy($index); 

!! 私はgetRepositoryをDBから読み込んだので、フラッシュされていないオブジェクトは見つかりません。

私の質問:私はバッチ全体をフラッシュする前に、それらを再利用するために永続化された(私は彼らが "教義セッション"のどこかにいると思います)

すべてのプロファイルには256個の物理プルームがあります。

すべてのプロファイルに1 plumeOptionsというレコードが割り当てられています。

plumeOptionsには、PhysicalPlumeのFKであるカートリッジプルームがあります。

すべてのプルームは、ID(自動生成)およびINDEX(ユーザ生成)によって識別されます。

ルール:プロファイル1にはphysical_plume_index番号3(=インデックス)が接続されています。

今、関連するすべてのデータを含むプロファイルを別のプロファイルにコピーしたいと考えています。

新しいプロファイルが作成されました。新しい256プルームが作成され、古いプロファイルからコピーされます。

私はここに新しいプルーム指数3.

チェックに新しいプロファイルをリンクする:http://pastebin.com/WFa8vkt1

答えて

9

私はあなたがこの機能を見てしたいかもしれないと思う:

$entityManager->getUnitOfWork()->getScheduledEntityInsertions() 

まだ保持されているエンティティオブジェクトのリストを返します。

ええと、上記のように完全なリスト(配列として)を取得しますが、getRepositoryのように照会することはできません。私はあなたのために何かを見つけようとします。

+0

あなたの返信はthxです。 私の[編集]セクションを確認してください.. – xeon

+0

私は私のアクション内でダブルフラッシュ()を行うことができますか? 私はそれを試したことはありませんが、ちょうど質問..多分愚かなもの?!? 新しく作成されたプルームをフラッシュしてから、他のプルームオプションを引き続き取得して、新しく作成されたプルームにリンクすることができます。 どのようにそのアイデアを見つけるのですか...? (うまくいけば愚かではないでしょう!!) – xeon

+0

私が知っている限り、あなたは何度もflush()を呼び出すことができます。 Offcourseのベストプラクティスは、接続トラフィックを保存するためにこれをできるだけ少なくすることです。しかし、以前に追加されたエンティティからIDが必要な場合は、それが良い方法です。 –

3

あなたは間違った角度から問題を見るかもしれないと思います。 Doctrineは、パーシスタンス層とデータベースアクセス層です。オブジェクトがメモリに格納されると、オブジェクトへのアクセスを提供するのはドメインモデルの責任です。だから問題はhow do you get a reference to an object without the persistance layerになるのですか?

後で保持する必要があるオブジェクトはどこに作成しますか?オブジェクトを作成するメソッド/サービスは、コントローラへの参照を返すことができるので、必要な場所にそれを伝播できますか?オブジェクトを保持するためにアプリケーションの他の場所で聴いているイベントをディスパッチできますか?

私の意見では、Doctrineはアプリケーションの起動時にできるだけ早くドメインモデルを初期化し、アプリケーションのシャットダウン時に要求時にドメインモデルの変更を永続させる。リポジトリを使用してリクエストの途中でオブジェクトを保持することは、おそらくコードの匂いであり、アプリケーションのフローをリファクタリングしてその必要性を取り除く方法を見てください。

+0

私はそれがアクセスを提供するドクトリンの仕事ではないことに同意していません。少なくともZendでは、Doctrineが** Entity Manager **として使われていますが、私はオブジェクトへの参照を含むべき場所とまったく同じように思えます。コードが永続性とエンティティを維持したいと判断した後で、エンティティがDBにまだ書き込まれているかどうかを(一般的に)気にする必要がある永続化レイヤーDoctrineだけが必要です。おそらくZendでは、EntityManagerはDoctrineリポジトリ以外のエンティティにアクセスするための他の方法を提供することができますが、もしそうなら、私はその方法が何であるか分かりません。 –

+0

私はあなたが質問を理解したとは思わない: – xDaizu

0

あなたは効果的なビジネスロジックの問題です。

データベースを照会すると、まだフラッシュされていないfindbyクエリー・オブジェクトは、すでに機能スコープ内にあるオブジェクトを照会しているDBレイヤーをより多く把握できます。

また、findOneByは以前に同じ機能で保存された他のオブジェクトも取得することに注意してください。

作成した新しいオブジェクトの中から検索する必要がある場合は、f.e.を作成する必要があります。それらをセッション配列変数に格納し、それらをforeachで繰り返します。

すでに保存されているアイテムといくつかの新しいアイテムが混在している必要がある場合は、2つの部分を別々に、1つはforeachで、もう1つはリポジトリクエリで別々に処理する必要があります。

関連する問題