[解決済み] Doctrine 2 のエンティティで変更/更新されたフィールドをすべて取得するビルトインの方法はありますか?
質問
あるエンティティを取得するとします。
$e
を取得し、セッターでその状態を変更するとします。
$e->setFoo('a');
$e->setBar('b');
変更されたフィールドの配列を取得することは可能でしょうか?
私の例の場合、私は以下のものを取得したいと思います。
foo => a, bar => b
を結果的に
PS: そうです、すべてのアクセサを変更してこの機能を手動で実装できることは知っていますが、これを行うための何か便利な方法を探しています。
どのように解決するのですか?
この場合
Doctrine\ORM\EntityManager#getUnitOfWork
を使うことで
Doctrine\ORM\UnitOfWork
.
そして、チェンジセット計算を開始するために
Doctrine\ORM\UnitOfWork#computeChangeSets()
.
のようなメソッドも使用できます。
Doctrine\ORM\UnitOfWork#recomputeSingleEntityChangeSet(Doctrine\ORM\ClassMetadata $meta, $entity)
のようなメソッドも使えます。
その後で
Doctrine\ORM\UnitOfWork#getEntityChangeSet($entity)
を使って、オブジェクトへの全ての変更を取得することができます。
まとめると
$entity = $em->find('My\Entity', 1);
$entity->setTitle('Changed Title!');
$uow = $em->getUnitOfWork();
$uow->computeChangeSets(); // do not compute changes if inside a listener
$changeset = $uow->getEntityChangeSet($entity);
注意 更新されたフィールドを取得しようとすると を preUpdate リスナーの内部で の中で、更新されたフィールドを取得しようとしている場合、すでに行われているので、変更セットを再計算しないでください。単にエンティティに行われたすべての変更を取得するために getEntityChangeSet を呼び出すだけです。
警告です。 コメントで説明されているように、この解決方法は Doctrine のイベントリスナーの外側で使ってはいけません。これは Doctrine の動作を壊してしまいます。
関連
-
[解決済み】SQLSTATE[42000]: 構文エラーまたはアクセス違反が発生しました。1064 SQL 構文にエラーがあります - PHP - PDO [重複]。
-
[解決済み】++と*+の意味は何ですか?
-
[解決済み】不明なMySQLサーバーのホスト
-
[解決済み】Apache + PHPで「ヘッダの前にスクリプトの出力が終了する」件
-
[解決済み】foreach()に与えられた引数が無効です。)
-
[解決済み] SQLSTATE[HY093]: 無効なパラメータ番号: パラメータが定義されていません
-
[解決済み】 libapache2-mod-php7 パッケージが見つからない。
-
[解決済み] 警告:mysqli_fetch_array()は、パラメータ1がmysqli_resultであることを期待する、オブジェクトはで指定された。
-
[解決済み] ずっとUTF-8
-
[解決済み] 配列の最後の要素を削除せずに取得する最適な方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】PHP - 構文エラー、予期しないT_CONSTANT_ECAPSED_STRING [閉店].
-
[解決済み】move_uploaded_fileは、「failed to open stream: Permission denied" というエラーが出る
-
[解決済み】PHPで空の値からデフォルトオブジェクトを作成する?
-
[解決済み】空の配列要素を削除する
-
[解決済み】メンバ関数をnullで呼び出す?
-
[解決済み】XAMPPエラー: www.example.com:443:0 サーバー証明書に、サーバー名と一致するIDが含まれていません。
-
[解決済み】Netbeans 7.4 for PHPで「スーパーグローバルな$_POST配列に直接アクセスしないでください」という警告が発生する。
-
[解決済み] mysqli_fetch_assoc() は、パラメータ 1 が mysqli_result であることを期待し、boolean が与えられる [重複] 。
-
[解決済み] Uncaught Error: 未定義の関数 mysql_escape_string() の呼び出し。
-
[解決済み】mysqli::query(): mysqli をフェッチできない