2013-03-21 12 views
19

के साथ सिद्धांत 2 हटाएं मेरे पास वनटॉनी, Project और Services संबंध के साथ दो इकाइयां हैं। अब मैं project_id द्वारा सभी सेवाओं को हटाना चाहता हूं।क्वेरी बिल्डर

प्रथम प्रयास:

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

यह प्रयास अपवाद Entity Service does not have property project_id साथ विफल रहता है। और यह सच है, कि संपत्ति मौजूद नहीं है, यह केवल डेटाबेस तालिका में विदेशी कुंजी के रूप में है।

दूसरा प्रयास:

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

यह एक generetate एक गैर मान्य DQL क्वेरी बहुत।

किसी भी विचार और उदाहरण का स्वागत किया जाएगा।

उत्तर

40

आप डीक्यूएल के साथ काम कर रहे हैं, एसक्यूएल नहीं, इसलिए अपनी स्थिति में आईडी का संदर्भ न दें, इसके बजाय ऑब्जेक्ट का संदर्भ लें।

तो आपका पहला उदाहरण के लिए परिवर्तित किया जाएगा:

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

तीसरी पंक्ति को निम्नानुसार लिखा जा सकता है: $ qb-> जहां ('s.project =: project'); – Oli

6

तुम सच में परियोजना वस्तु नहीं मिल सकता है और आप केवल आईडी के साथ आप इस का उपयोग कर सकते को संभालने के लिए है।

सिद्धांत दस्तावेज से उद्धरण: सिद्धांत के साथ थोक हटावट के लिए दो संभावनाएं हैं। आप या तो एक एकल DQL DELETE क्वेरी जारी कर सकते हैं या आप एक समय में उन्हें हटाने के परिणामों पर पुन: प्रयास कर सकते हैं। (नीचे मैं केवल पहला समाधान पेस्ट करता हूं)

डीक्यूएल क्वेरी थोक डेलीट के लिए सबसे प्रभावी तरीका एक डीक्यूएल डिलीट क्वेरी का उपयोग करना है।

उदाहरण है कि मेरे परियोजना

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

में काम किया इकाई TemplateBlock में मैं संपत्ति कहा जाता टेम्पलेट जो DB में template_id को मैप किया है की है।

लेकिन मैं मानता हूं कि ऐसा करने का अत्यधिक पसंदीदा तरीका वस्तुओं का उपयोग कर रहा है।

+9

घर पर ऐसा मत करो, कृपया एसक्यूएल इंजेक्शन से अवगत रहें! – chteuchteu

संबंधित मुद्दे