2009-07-15 24 views
22

'da "varsa, güncelleştir" uygulanıyor Tek işlemde INSERT OR UPDATE IF EXISTS çalışıyorum.Doctrine ORM

MySQLyılında, ben genelde DUPLICATE KEY ("YİNELENEN KEY UPDATE".) Kullanmak Çeşitli SQL varyantları ve alt sorgular kullanarak bu soruna birçok çözüm farkında değilim, ama bu uygulamaya çalışıyorum Doktrinde (PHP ORM). Öylesine özellik dolu olduğu için bunu yapmak için Doktrin yöntemleri var gibi görünüyor, ama hiçbir şey bulamıyorum. Bu tür bir şey, PHP ORM paketlerini bir nedenden dolayı kullanan bir problem midir? Ya da Doktrin uzmanlarının bunu hack veya herhangi bir yolla nasıl gerçekleştireceklerini biliyor musunuz?

+0

Bu işlevi uygulamak için bir eklenti üzerinde çalışmaya başladım. Hala erken aşamalarda ama benim kullanım durumum için test edildi ve çalışıyor. Şu adresten ulaşılabilir: https://github.com/m14t/m14tDoctrineRecordPlugin Test vakaları, hata raporları ve çekme istekleri karşılanır. – m14t

+0

@ pix0r 'ın çözümünü – Mojtaba

cevap

2

Doctrine, replace() yöntemini kullanarak REPLACE INTO desteklemektedir. Bu tam olarak aradığınız ON DUPLICATE KEY UPDATE gibi çalışmalıdır.

Dokümanlar: Aklıma Replacing Records

+9

çözüm olarak işaretlemelisiniz, REPLACE ile ilgili tek sorun, düştüğü ve yeni bir satır oluşturduğu (gerçek bir UPDATE yerine) oluşturacağı ve böylece otomatik artışların (durumda, birincil kimliğim). Burada bir şey mi eksik? örn. - otomatik artım kimliğim 9'dur, ancak sayı 3000'dir. Satır 9 için INTO INTO'yu gerçekleştirdiğimde, yeni satır kimliği 3001'dir. – seans

+0

Bu bir çözüm değildir, yerine bir silme/ekleme yapmak ve otonimerik değiştirmek değerler (ex id) – Exos

+0

Yukarıdaki Link bozuk. –

5

tek şey başka türlü yeni varlık yaratmak Varlığından eğer varlık için ilk sorgu etmektir.

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

Satırın sorgu ile kaydetme arasında oluşturulmasını sağlayan hiçbir şey yok. –

+5

İşlemlerin amacı bu değil midir? – chiborg

+1

@IliaJerebtsov gibi çok tehlikeli, kalıcı ve flush arasında bir satır oluşturulabilir. Bu durumda saf SQL kullanmayı düşünmelisiniz; –