web-dev-qa-db-ja.com

Doctrine 2エンティティからの更新

以下と同様の方法でエンティティを更新することは可能ですか?

$data       = new ATest();  // my entity
$data->id   = 1;            // id 1 already exists, I just want to update this row
$data->name = "ORM Tested"; // changed the name

$entityManager->persist($data);
$entityManager->flush();

これは、データベース内の既存の行を更新する代わりに、オブジェクトのIDを挿入および変更します。

43
Dennis

私は使わなければなりませんでした

$entityManager->merge($data)
53
Dennis

Persistではなくmergeを呼び出す必要があります。

$data = new MyEntity();
$data->setId(123);
$data->setName('test');

$entityManager->merge($data);
$entityManager->flush();
88

または、空のエンティティではなく、管理対象エンティティを取得します。

$data = $entityManager->getRepository('ATest')->findOne(1); // ATest is my entitity class
$data->name = "ORM Tested"; // just change the name

$entityManager->persist($data);
$entityManager->flush();

エンティティがすでに管理されている場合、persist()は新しいエンティティを挿入するのではなく、エンティティを更新します。

13
Tony Bogdanov

getReferenceを使用して、データベースの状態を取得せずに、識別子によってエンティティプロパティを更新することもできます。

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/advanced-configuration.html#reference-proxies

これにより、_new Entity_をインスタンス化するか、find()を使用してデータベースから明示的にエンティティを取得する代わりに、IDによってエンティティと連携する単純なプロキシが確立されます。

_$data = $entityManager->getReference('ATest', $id);
$data->setName('ORM Tested');
$entityManager->flush();
_

これは、エンティティのOneToManyまたはManyToMany関連付けを更新する場合に特に便利です。 EG:$case->addTest($data);

一般に、エンティティを更新することを意図している場合でも、新しいエンティティの識別子を手動で設定することは悪い習慣です。代わりに、通常EntityManagerまたはEntityコンストラクターにUUIDなどの適切な識別子を確立させることが最善です。このため、Doctrineは、セッターメソッドを持たないプライベートプロパティとして識別子を持つエンティティをデフォルトで生成します。

12
fyrye