2013-03-21 27 views
19

OneToMany, Project ve Services ile iki Varlığım var. Şimdi tüm hizmetleri project_id ile kaldırmak istiyorum.Doctrine 2 sorgu oluşturucuyla silme

İlk girişimi:

$qb = $em->createQueryBuilder(); 
$qb->delete('Services','s'); 
$qb->andWhere($qb->expr()->eq('s.project_id', ':id')); 
$qb->setParameter(':id',$project->getId()); 

Bu girişim İstisna Entity Service does not have property project_id ile başarısız olur. Ve doğru, bu özellik mevcut değil, sadece yabancı anahtar olarak veritabanı tablosunda.

İkinci girişimi:

$qb = $em->createQueryBuilder(); 
$qb->delete('Services','s')->innerJoin('s.project','p'); 
$qb->andWhere($qb->expr()->eq('p.id', ':id')); 
$qb->setParameter(':id',$project->getId()); 

Bu seferki generetate çok olmayan bir geçerli DQL sorgusu.

Herhangi bir fikir ve örnek kabul edilecektir.

cevap

40

SQL ile değil, DQL ile çalışıyorsunuz, dolayısıyla durumunuzdaki kimliklere başvurmayın, bunun yerine nesneyi başvuruyorsunuz. Gerçekten proje nesnesini alamıyorsanız

$qb = $em->createQueryBuilder(); 
$qb->delete('Services', 's'); 
$qb->where('s.project = :project'); 
$qb->setParameter('project', $project); 
+0

Üçüncü satır aşağıdaki gibi yeniden yazılabilir: $ qb-> where ('s.project =: project'); – Oli

6

ve size bunu kullanabilirsiniz sadece id ile işlemek zorunda:

Yani ilk örnek için değişmiş olacaktır.

Doktrin dokümantasyonundan alıntı: Doktrin ile toplu silme için iki olasılık vardır. Tek bir DQL DELETE sorgusu düzenleyebilir veya sonuçları birer birer kaldırarak yineleyebilirsiniz. (Aşağıda yalnızca ilk çözümü yapıştırın)

DQL Sorgu Toplu silme işlemlerinin en etkili yolu bir DQL DELETE sorgusu kullanmaktır. varlık TemplateBlock olarak projemin

$q = $em->createQuery('delete from AcmeMyTestBundle:TemplateBlock tb where tb.template = '.intval($templateId)); 
$numDeleted = $q->execute(); 

çalışmış

Örnek I db template_id eşleştirilir mülkiyet denilen şablon var.

Fakat bunu yapmanın oldukça tercih edilen yolunun nesneleri kullanması olduğunu kabul ediyorum.

+9

Evde bunu yapma, lütfen SQL enjeksiyonlarından haberdar olun! – chteuchteu

İlgili konular