2009-07-15 13 views
22

Ich versuche INSERT OR UPDATE IF EXISTS in einer Transaktion.implementieren "update wenn existiert" in Doctrine ORM

in mysql, würde ich in der Regel DUPLICATE KEY („UPDATE ON DUPLICATE KEY“.) Verwende ich bin mir dessen bewusst viele Lösungen für dieses Problem verschiedene SQL-Varianten und Unterabfragen verwenden, aber ich versuche, dies zu implementieren in Lehre (PHP ORM). Es scheint, dass es Doctrine-Methoden dafür geben würde, da es so umfangreich ist, aber ich finde nichts. Ist diese Art von Sache ein Problem mit PHP ORM-Paketen aus irgendeinem Grund? Oder wissen Doktorexperten, wie man dies durch Hacks oder andere Mittel erreicht?

+0

Ich habe begonnen, an einem Plugin zu arbeiten, um diese Funktionalität zu implementieren. Es ist immer noch in den frühen Phasen, aber getestet und funktioniert für meinen Anwendungsfall. Es ist verfügbar unter: https://github.com/m14t/m14tDoctrineRecordPlugin Testfälle, Fehlerberichte und Pull-Anfragen willkommen. – m14t

+0

Ich denke, Sie sollten @ pix0r 's Antwort als die Lösung – Mojtaba

Antwort

2

Doktrin unterstützt REPLACE INTO mit der replace() Methode. Dies sollte genauso funktionieren wie die von Ihnen gesuchte ON DUPLICATE KEY UPDATE.

Docs: Replacing Records

+9

markieren das einzige Problem mit REPLACE scheint zu sein, dass es fällt und dann eine neue Zeile erstellt (anstatt eine tatsächliche UPDATE), so dass das automatische Inkrement IDs (in diesem Fall Fall, meine primäre ID). Fehle ich hier etwas? zB - meine Autoinkrement-ID ist 9, aber die Zählung ist wie 3000. Wenn ich REPLACE INTO für Zeile 9 ausführe, lautet die neue Zeilen-ID 3001. – seans

+0

Es ist keine Lösung, die ersetzen scheint ein löschen/einfügen und ändern autonumerisch Werte (ex id) – Exos

+0

oben Link ist kaputt. –

5

Das einzige, was ich denken kann, ist zunächst für die Entität abfragen, wenn es sonst existiert neue Entität erstellen.

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

Es gibt nichts, das sicherstellt, dass die Zeile zwischen der Abfrage und dem Speichern nicht erstellt wird. –

+5

Sind das nicht die Transaktionen? – chiborg

+1

Sehr gefährlich, wie @IliaJerebtsov sagte, eine Zeile kann zwischen dem Persistent und dem Flush erstellt werden. In diesem Fall sollten Sie in Betracht ziehen, reines SQL zu verwenden ;-( –

Verwandte Themen