2010-12-02 16 views
52

हाय मुझे निम्न क्वेरी मिल गई है लेकिन यह काम नहीं कर रहा है।सिद्धांत 2: क्वेरी बिल्डर के साथ अद्यतन क्वेरी

$q = $this->em->createQueryBuilder() 
    ->update('models\User', 'u') 
    ->set('u.username', $username) 
    ->set('u.email', $email) 
    ->where('u.id = ?1') 
    ->setParameter(1, $editId) 
    ->getQuery(); 
$p = $q->execute(); 

यह निम्न त्रुटि संदेश देता है:

$qb = $this->em->createQueryBuilder(); 
$q = $qb->update('models\User', 'u') 
     ->set('u.username', $qb->expr()->literal($username)) 
     ->set('u.email', $qb->expr()->literal($email)) 
     ->where('u.id = ?1') 
     ->setParameter(1, $editId) 
     ->getQuery(); 
$p = $q->execute(); 

कोई एक:

Fatal error: Uncaught exception 'Doctrine\ORM\Query\QueryException' with message '[Semantical Error] line 0, col 38 near 'testusername WHERE': Error: 'testusername' is not defined.' in ...

मैं किसी भी मदद

उत्तर

110

मुझे लगता है कि आप ->set() साथ Expr उपयोग करने की आवश्यकता की खुशी होगी या अपने सभी मान पैरामीटर बनाएं:

$qb = $this->em->createQueryBuilder(); 
$q = $qb->update('models\User', 'u') 
     ->set('u.username', '?1') 
     ->set('u.email', '?2') 
     ->where('u.id = ?3') 
     ->setParameter(1, $username) 
     ->setParameter(2, $email) 
     ->setParameter(3, $editId) 
     ->getQuery(); 
$p = $q->execute(); 
+2

आपको हमेशा अपने चर को सिद्धांत क्वेरी के पैरामीटर के रूप में पास करना चाहिए! –

+0

क्या आप एक से कई अपडेट के लिए एक उदाहरण भी प्रदान कर सकते हैं? –

+4

आप $ qb-> अद्यतन (...) -> सेट ('u.username', $ qb-> createNamed पैरामीटर ($ उपयोगकर्ता नाम) का उपयोग भी कर सकते हैं) '' और सेट -> पैरामीटरमीटर भाग को छोड़ दें। यह आईएमओ सबसे अच्छा तरीका है। एक समान विधि '' -> बनानाPositionalParameter() '' है। Http://doctrine-dbal.readthedocs.org/en/latest/reference/query-builder.html#binding-parameters-to-placehold देखें –

5

मान लीजिए कि आप कुछ उपयोगकर्ताओं (कुछ व्यवस्थापक जो उन विवरण पर/लिखने पढ़ने की पहुंच हो सकता है द्वारा पहुँचा जा सकता) की एक सूची दिखा बैकएंड करते हैं।
वहां कुछ घटनाएं ट्रिगर होने पर जावास्क्रिप्ट से पुनर्प्राप्त करने के लिए आप डेटा आईडी के रूप में अपनी आईडी पर प्रिंट कर सकते हैं।

फिर एक अद्यतन इस तरह से क्रियान्वित किया जा सकता ...

class UserRepository extends \Doctrine\ORM\EntityRepository 
{ 
    public function updateUserStatus($userId, $newStatus) 
    { 
     return $this->createQueryBuilder('u') 
      ->update() 
      ->set('u.isActive', '?1') 
       ->setParameter(1, $qb->expr()->literal($newStatus)) 
      ->where('u.id = ?2') 
       ->setParameter(2, $qb->expr()->literal($userId)) 
      ->getQuery()->getSingleScalarResult(); 
    } 

और (AJAX) निपटने कार्रवाई के अंदर ...

# Post datas may be handled with a specific custom formType 
    # … OR … 
    # Directly retrieved from request object 
    $userId = (int)$request->request->get('userId'); 
    $newStatus = (int)$request->request->get('newStatus'); 
    $em = $this->getDoctrine()->getManager(); 
    $r = $em->getRepository('NAMESPACE\User') 
      ->updateUserStatus($userId, $newStatus); 
    if (!empty($r)){ 
     # Row updated 
    } 
    # … 

कार्य सिद्धांत 2.5 का उपयोग कर उदाहरण (Symfony3 के शीर्ष पर)

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