11

私は長い間、SQL クエリ ベースのデータベース アクセス レベルを使用していました。しかし今、ORM Doctrine2 を使用することにしました。現時点で、エンティティ ワークフローの概念的な誤解が 1 つあります。

例によって最もよく説明されています:

 try {
   $user = $entityManager->find('User', 1);
   $user->setName('New name');
   $entityManager->flush();
 }
 catch (...)
 {
   // !we are here: changes failed and $user-row in DB was not updated
 }

 // ...

 $user = $entityManager->find('User', 1);
 $user->setOther('Other');
 $entityManager->flush(); // <- in this request both [other] and [name] fields will be updated to DB, but only [other] update expected

最初のコード ブロックで、$user オブジェクトをフェッチしました。[名前] を変更して保存しようとしましたが、失敗しました。2 番目のブロック (最初のブロックとは無関係) で、$user オブジェクトを再度フェッチしました。しかし、ORM は最初と同じオブジェクトへのリンクを返しました。したがって、このオブジェクトはすでに [name] プロパティを変更しています。2 番目のブロックの最後の行で、[other] フィールドだけを保存したかったのですが、[other] と [name] の両方が更新されます。

この状況を解決する正しい方法は何ですか?

4

2 に答える 2

17

これは仕様によるものです。

エンティティ マネージャにより、特定の ID に対して常に同じエンティティが返されることが保証されます。結局のところ、それがアイデンティティの意味です。ID 1 を持つ単一の一意のユーザーのみが存在できます。

データベースからエンティティを「リフレッシュ」したい場合は、EntityManager::refresh()がそれを行います。ドキュメントから:

データベースからエンティティの永続状態を更新し、まだ永続化されていないローカルの変更をオーバーライドします。

于 2012-05-25T19:24:31.580 に答える
6

コマンドを実行する必要があります: $entityManager->detach($userEntity);。フラッシュを呼び出した後、変更はデータベースに反映されません。他のエンティティは機能します。

于 2014-01-16T02:34:14.790 に答える