2012-01-06 7 views
7

डॉक्ट्रिन, symfony2 का उपयोग कर डेटाबेस में एकाधिक रिकॉर्ड अपडेट करने का सबसे अच्छा तरीका क्या है?सिम्फनी - एकाधिक रिकॉर्ड अपडेट करें

मुझे रिकॉर्ड्स आईडी की सरणी मिलती है जिसे मुझे अपडेट करना है।
मैं प्रत्येक रिकॉर्ड को अपने सरणी से प्राप्त सरणी से कॉलम show_order में असाइन करना चाहता हूं। तो अगर मैं सरणी $ सरणी = सरणी (22, 1, 5, 10) प्राप्त तो मैं

$i = 0; 
foreach($array as $a) { 
    $record = $this->getDoctrine->getRepository('AcmeBundle:SomeEntity')->findOneById($a); 
    if ($record != null) $record->setOrder($i++); 
} 
$this->getDoctrine()->getEntityManager()->flush(); 

क्या करना चाहते हैं, लेकिन यह भयानक तरीका है, क्योंकि प्रत्येक रिकॉर्ड के लिए मैं किसी एक का चयन करते हैं, तो प्रश्नों की संख्या है पर)।

इसे बेहतर कैसे करें?

+0

मैं अब एक विचार के लिए मिल गया है: सभी रिकॉर्ड प्राप्त जांच करें कि कौन क्रम बदल गया है और केवल अद्यतन उन्हें। लेकिन मैं उस समाधान के कारण संतुष्ट नहीं हूं। तो यह सभी रिकॉर्ड्स प्राप्त करने के लिए एक चयन करेगा, कुछ चयन (इकाई ऑब्जेक्ट्स प्राप्त करने के लिए) और कुछ अपडेट (या शायद एक, क्योंकि मुझे लगता है कि फ्लश() के बाद अद्यतन लागू किया गया है)। –

+0

यदि Doctrine2 का उपयोग करके कोई अच्छा समाधान नहीं है तो शायद मुझे इसे स्पष्ट PHP में करना चाहिए और केस का उपयोग कब करें ... फिर ... एसक्यूएल क्वेरी में? –

उत्तर

6

कुछ की तरह ...

foreach ($repo->findById($ids) as $obj) { 
    $obj->setOrder(array_search($obj->getId(), $ids)); 
} 

$em->flush(); 
+0

मेरे लिए अच्छा लगता है - एक का चयन करें, एक अपडेट। मैं पूरी तरह से भूल गया कि मैं खोज में तर्क के रूप में सरणी पारित कर सकते हैं। :) –

+3

मैंने इसे अपने सिम्फनी प्रोजेक्ट में अभी लागू किया है और ऐप/dev.log को देखने से यह एक चयन और रिकॉर्ड प्रति एक अपडेट करता है - एक अपडेट नहीं – semateos

6

पहले विकल्प के रूप में, आपको Batch Processing पर विचार करना चाहिए। यदि यह किसी कारण से आपके लिए व्यवहार्य नहीं है, तो दूसरा विकल्प सादे एसक्यूएल के साथ जाना है, शायद DBAL के माध्यम से।

+0

काफी उपयोगी चीजें, धन्यवाद। –

0

तो यह अभी भी 0 (एन) है, लेकिन यह नहीं बल्कि 2n से 1n है।

namespace BRS\PageBundle\Repository; 

use Doctrine\ORM\EntityRepository; 

class ContentRepository extends EntityRepository 
{ 
    public function reorder($content) 
    {  
     $em = $this->getEntityManager(); 

     $count = 0; 

     foreach($content as $i => $content_id){ 

      $q = $em->createQuery('update BRSPageBundle:Content c set c.display_order = ?1 where c.id = ?2') 
        ->setParameter(1, $i) 
        ->setParameter(2, $content_id); 

      $count += $q->execute(); 
     } 

     return $count; 
    } 
} 

तो कहते हैं कि तुम इस तरह क्रम में सामग्री आईडी की एक सरणी है:

$content = array(23,12,8,4); 
फिर

अनावश्यक चयन बचने के लिए, मैं इस समस्या को एक custom repository class और सिद्धांत क्वेरी बिल्डर इसलिए की तरह का उपयोग कर हल आप बहुत आसानी से अपने नियंत्रक से आदेश को अपडेट कर सकते हैं:

$count = $this->getRepository('BRSPageBundle:Content')->reorder($content);