Doctrine2 ドキュメント翻訳

8. Working with Objects — Doctrine 2 ORM 2 documentation を翻訳してみようと思います。

8. Working with Objects

この章は、EntityManager と UnitOfWork の理解を助けるものです。
Unit of Work は、オブジェクトレベルのトランザクションに似ています。
Unit of Work は、EntityManager が生成された後、または EntityManager#flush() の後に暗黙的に開始されます。
Unit of Work は、EntityManager#flush() を呼び出すことでコミット(そして、新しい Unit of Work が開始)されます。
Unit of Work は、明示的に EntityManager#close() を呼び出すことで、クローズすることができます。
Unit of Work 内のまだ保存されていないオブジェクトに対する変更は、すべて失われます。

【Note】
これまでに発生した書き込み操作をデータベースに反映するのは EntityManager#flush() だけ、ということを理解することが非常に重要です。
EntityManager#persist($entity)EntityManager#remove($entity) といった他のメソッドは、フラッシュの際にこれらを実行するという事を Unit Of Work に通知するだけです。
EntityManager#flush() を呼び出さない限り、すべての変更要求は失われます。

8.1. Entities and the Identity Map

エンティティは、IDを持つオブジェクトです。IDは、ドメイン内部で概念的意味を持っています。CMSアプリケーション内の各記事は、固有のIDを持っています。そのIDによって各記事を識別することができます。

Hello World」という見出しを持つID:1234の記事を見つける、という例を見てみましょう。

<?php
$article = $entityManager->find('CMS\Article', 1234);
$article->setHeadline('Hello World dude!');

$article2 = $entityManager->find('CMS\Article', 1234);
echo $article2->getHeadline();

とある記事が、EntityManagerから2回アクセスされ、その間に変更されたというケースを考えます。
Doctrine2 はID:1234の記事のただ1つのインスタンスへのアクセスを提供します。
どんなQueryメソッド(find、Repositoryのファインダー、またはDQL)を使っても、EntityManagerから検索することができます。
これは「Identity Map(恒等写像)」パターンと呼ばれ、Doctrineは各エンティティとPHPリクエストごとに取得されたIDのマップを保持し、同じインスタンスを返し続けることを意味します。

前述の例では、「Hello World dude!」と画面に表示されます。
以下のコードを実行することで、$article と $article2 が確かに同じインスタンスを指し示していることを確認できます。

<?php
if ($article === $article2) {
    echo "Yes we are the same!";
}

...今日はここまで。