2009-07-15 5 views
22

Sto provando a INSERT OR UPDATE IF EXISTS in una transazione.implementare "aggiornamento se esiste" in Doctrine ORM

in mysql, vorrei generalmente usare DUPLICATE KEY ("UPDATE ON DUPLICATE KEY".) Sono a conoscenza di molte soluzioni a questo problema utilizzando diverse varianti SQL e sub-query, ma sto cercando di attuare questa in Doctrine (PHP ORM). Sembra che ci siano i metodi di Doctrine per farlo poiché è così ricco di funzionalità, ma non trovo nulla. Questo è un problema con i pacchetti PHP ORM per qualche motivo? Oppure alcuni esperti di Doctrine sanno come raggiungere questo obiettivo tramite hack o qualsiasi mezzo?

+0

Ho iniziato a lavorare su un plugin per implementare questa funzionalità. È ancora nelle fasi iniziali, ma testato e funzionante per il mio caso d'uso. È disponibile all'indirizzo: https://github.com/m14t/m14tDoctrineRecordPlugin Casi di test, segnalazioni di bug e richieste di benvenuto. – m14t

+0

Penso che dovresti contrassegnare la risposta di @ pix0r come la soluzione – Mojtaba

risposta

2

Doctrine supporta REPLACE INTO utilizzando il metodo replace(). Questo dovrebbe funzionare esattamente come lo ON DUPLICATE KEY UPDATE che stavi cercando.

Documenti: Replacing Records

+9

l'unico problema con REPLACE sembra essere che cade e quindi crea una nuova riga (invece di eseguire un UPDATE effettivo), lasciando così cadere gli ID di incremento automatico (in questo caso, il mio id principale). Mi sto perdendo qualcosa qui? - il mio ID di incremento automatico è 9, ma il conteggio è come 3000. Quando eseguo REPLACE INTO per la riga 9, l'ID della nuova riga è 3001. – seans

+0

Non è una soluzione, la sostituzione sembra fare una cancellazione/inserimento e cambio autonumerico valori (ex id) – Exos

+0

sopra Link non funzionante. –

5

L'unica cosa che mi viene in mente è quello di interrogare prima per l'entità se esiste altrimenti creare nuova entità.

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

Non c'è nulla che assicuri che la riga non venga creata tra la query e il salvataggio. –

+5

Non è per quello che sono le transazioni? – chiborg

+1

Molto pericoloso, come ha detto @IliaJerebtsov, è possibile creare una riga tra persist e flush. In questo caso dovresti considerare di usare puro SQL ;-( –