2013-06-25 6 views
8

मैं सिद्धांत QueryBuilder उपयोग करने के लिए निम्नलिखित SQL क्वेरी प्रदर्शन करने के लिए कोशिश कर रहा हूँ मिलती है:सिद्धांत QueryBuilder साथ हटाना

DELETE php FROM product_hole_pattern php 
INNER JOIN hole_pattern hp ON php.hole_pattern_id = hp.id 
INNER JOIN hole_pattern_type hpt ON hp.hole_pattern_type_id = hpt.id 
WHERE php.product_id = 4 AND hpt.slug='universal'; 

मैं इस

$qb = $this->entityManager->createQueryBuilder(); 
$query = $qb->delete('\SANUS\Entity\ProductHolePattern', 'php') 
    ->innerJoin('php.holePattern', 'hp') 
    ->innerJoin('hp.holePatternType', 'hpt') 
    ->where('hpt.slug = :slug AND php.product=:product') 
    ->setParameter('slug','universal') 
    ->setParameter('product',$this->id) 
    ->getQuery(); 

लेकिन मैं मिलता है:

[Semantical Error] line 0, col 50 near 'hpt.slug = :slug': Error: 'hpt' is not defined. 

त्रुटि संदेश के साथ आता है DQL है:

DELETE \SANUS\Entity\ProductHolePattern php 
WHERE hpt.slug = :slug AND php.product=:product 

तो जॉइन पूरी तरह से छोड़े जाने लगते हैं।

उत्तर

8

यह पूरा करने के पहले संस्थाओं क्वेरी करने के लिए हो सकता है एक तरह से आप का उपयोग कर नष्ट करना चाहते मिलती है:

$qb = $this->entityManager->createQueryBuilder(); 
$query = $qb->select('\SANUS\Entity\ProductHolePattern', 'php') 
    ->innerJoin('php.holePattern', 'hp') 
    ->innerJoin('hp.holePatternType', 'hpt') 
    ->where('hpt.slug = :slug AND php.product=:product') 
    ->setParameter('slug','universal') 
    ->setParameter('product',$this->id) 
    ->getQuery(); 
$results = $query->execute(); 

और फिर संस्थाओं आप परिणाम में पाया हटाएँ:

foreach ($results as $result) { 
    $this->entityManager->remove($result); 
} 

बनें

$this->entityManager->flush(); 

अपने आवेदन में उचित स्थान पर (आमतौर पर नियंत्रक)।

+1

उल्लेख करने के लिए बस दो चीजें हैं। 1. यह बहुत महंगा हो सकता है। 2. इस तरह के तर्क को नियंत्रक में डालने की हिम्मत न करें! – EnchanterIO

+2

तीसरी बात - यह दौड़ की स्थिति के लिए प्रवण है। – Kaspars

7

ऐसा लगता है कि डीक्यूएल इस तरह के डिलीट स्टेटमेंट का समर्थन नहीं करता है। BNF from the Doctrine documentation इंगित करता है कि एक delete_statement रूप

delete_clause [where_clause] 

कहाँ delete_clause के रूप में परिभाषित किया गया है रखना चाहिए:

"DELETE" "FROM" abstract_schema_name [["AS"] identification_variable] 

तो मैं एक स्कीमा और एक जहां खंड प्रदान कर सकते हैं, लेकिन कोई मिलती है।

-2

Symfony2 पर प्रयास करें:

foreach ($results as $result) { 
    $em->remove($result); 
} 

$em->flush(); 

सभी Thats।

+0

ऐसे मामलों में जहां आपको अधिक निहित डिलीट (उदा। मूल प्रश्न) की आवश्यकता होती है, यह डिफ़ॉल्ट '$ em-> निकालें ($ इकाई) 'विधि काम नहीं करेगी। –

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