1回のトランザクションでINSERT OR UPDATE IF EXISTS
しようとしています。
mysqlでは、通常はDUPLICATE KEY
( "UPDATE ON DUPLICATE KEY")を使用します。さまざまなSQLバリアントとサブクエリを使用したこの問題の多くの解決策を知っていますが、私はm Doctrine(PHP ORM)でこれを実装しようとしています。機能が満載なので、これを行うためのDoctrineメソッドがあるようですが、私は何も見つかりません。この種のことは、何らかの理由でPHP ORMパッケージを使用する際の問題ですか?またはDoctrine専門家は、ハッキングを通じてこれを達成する方法を知っていますか?どういう意味ですか?
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();
私が考えることができる唯一のことは、エンティティが存在する場合は最初にクエリを実行し、そうでない場合は新しいエンティティを作成することです。
if(!$entity = Doctrine::getTable('Foo')->find(/*[insert id]*/))
{
$entity = new Foo();
}
/*do logic here*/
$entity->save();
Doctrineは、replace()
メソッドを使用してREPLACE INTO
をサポートします。これは、探していたON DUPLICATE KEY UPDATE
とまったく同じように機能するはずです。
ドキュメント: レコードの置き換え
最善の方法は、entityManager-> merge($ entity);を呼び出すことだと思います。ドキュメントで約束されている操作が存在する場合は、更新するのが最も近いためです: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-objects.html