2009-07-15 10 views
22

私はINSERT OR UPDATE IF EXISTSを1回のトランザクションで試行しています。Doctrine ORMに "update if exists"を実装します

mysqlのに、私は一般的にDUPLICATE KEY使用します(「DUPLICATE KEY ON UPDATE」と。)私は、さまざまなSQLの変異体およびサブクエリを使用してこの問題に多くのソリューションを認識してんだけど、私はこれを実装しようとしていますDoctrine(PHP ORM)にあります。それは、それが機能満載のので、これを行うためのDoctrineメソッドがあるようですが、何も見つけられません。 PHP ORMパッケージを何らかの理由で使用すると、このような問題が起こりますか?あるいは、どのような教義の専門家も、ハッキングや何らかの手段でこれを達成する方法を知っていますか?

+0

私はこの機能を実装するためにプラグインの作業を開始しました。それはまだ初期の段階ですが、私のユースケースのためにテストされ、働いています。 https://github.com/m14t/m14tDoctrineRecordPluginで入手できます。テストケース、バグレポート、プルリクエストを歓迎します。 – m14t

+0

あなたは@ pix0rの答えを解決策 – Mojtaba

答えて

2

Doctrineは、replace()メソッドを使用してREPLACE INTOをサポートしています。これは、あなたが探していたON DUPLICATE KEY UPDATEのように正しく動作するはずです。

ドキュメント:私は考えることができるReplacing Records

+9

とマークするべきだと思います。REPLACEの唯一の問題は、ドロップして新しい行を作成することです(実際のUPDATEを実行するのではなく)。ケース、私のプライマリID)。私はここに何かを逃していますか 例: - 私の自動インクリメントIDは9ですが、カウントは3000です。行9にREPLACE INTOを実行すると、新しい行IDは3001になります。 – seans

+0

解決策ではなく、置換は削除/挿入を行い、値(ex id) – Exos

+0

リンク先が壊れています。 –

5

唯一のものは、それはそれ以外の場合は、新しいエンティティを作成存在する場合は、エンティティのために最初に照会することです。 https://www.vivait.co.uk/labs/updating-entities-when-an-insert-has-a-duplicate-key-in-doctrineによれば、これは$entityManager->merge()で達成することができる

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

クエリと保存の間に行が作成されないようにするものは何もありません。 –

+5

それはどんな取引の対象ではありませんか? – chiborg

+1

@IliaJerebtsovのように、非常に危険です。持続とフラッシュの間に行を作成できます。この場合は、純粋なSQL ;-( –

0

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

$entityManager->merge($entity); 
$entityManager->flush(); 
関連する問題