以下と同様の方法でエンティティを更新することは可能ですか?
$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を挿入および変更します。
私は使わなければなりませんでした
$entityManager->merge($data)
Persistではなくmergeを呼び出す必要があります。
$data = new MyEntity();
$data->setId(123);
$data->setName('test');
$entityManager->merge($data);
$entityManager->flush();
または、空のエンティティではなく、管理対象エンティティを取得します。
$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()は新しいエンティティを挿入するのではなく、エンティティを更新します。
getReference
を使用して、データベースの状態を取得せずに、識別子によってエンティティプロパティを更新することもできます。
これにより、_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は、セッターメソッドを持たないプライベートプロパティとして識別子を持つエンティティをデフォルトで生成します。