web-dev-qa-db-ja.com

Doctrine ORMに存在する場合は更新」を実装する

1回のトランザクションでINSERT OR UPDATE IF EXISTSしようとしています。

mysqlでは、通常はDUPLICATE KEY( "UPDATE ON DUPLICATE KEY")を使用します。さまざまなSQLバリアントとサブクエリを使用したこの問題の多くの解決策を知っていますが、私はm Doctrine(PHP ORM)でこれを実装しようとしています。機能が満載なので、これを行うためのDoctrineメソッドがあるようですが、私は何も見つかりません。この種のことは、何らかの理由でPHP ORMパッケージを使用する際の問題ですか?またはDoctrine専門家は、ハッキングを通じてこれを達成する方法を知っていますか?どういう意味ですか?

24
seans

https://www.vivait.co.uk/labs/updating-entities-when-an-insert-has-a-duplicate-key-in-doctrine によると、これは$entityManager->merge()

$entity = new Table();
$entity->setId(1);
$entity->setValue('TEST');

$entityManager->merge($entity);
$entityManager->flush();
6
Björn Tantau

私が考えることができる唯一のことは、エンティティが存在する場合は最初にクエリを実行し、そうでない場合は新しいエンティティを作成することです。

if(!$entity = Doctrine::getTable('Foo')->find(/*[insert id]*/))
{
   $entity = new Foo();
}
/*do logic here*/
$entity->save();
5
ken

Doctrineは、replace()メソッドを使用してREPLACE INTOをサポートします。これは、探していたON DUPLICATE KEY UPDATEとまったく同じように機能するはずです。

ドキュメント: レコードの置き換え

3
pix0r

最善の方法は、entityManager-> merge($ entity);を呼び出すことだと思います。ドキュメントで約束されている操作が存在する場合は、更新するのが最も近いためです: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-objects.html

0
Javlonbek