2011-09-24 5 views
8

समान खोज के साथ डीबी रिकॉर्ड यहाँ है: Help with db query in drupal - if exists update else insertDrupal डालने या अद्यतन केवल एक समारोह

लेकिन drupal_write_record() तीसरा तर्क अद्यतन का निर्धारण या डालने के लिए है। शायद ड्रूपल का एक और कार्य है, जो स्वयं प्राथमिक कुंजी द्वारा सम्मिलित या अद्यतन निर्धारित करते हैं? या मुझे इसे स्वयं प्रोग्राम करना चाहिए?

उत्तर

9

db_merge() फ़ंक्शन पर एक नज़र डालें, मुझे लगता है कि इसमें वे सुविधाएं हैं जिन्हें आप ढूंढ रहे हैं।

1

यदि आप वास्तव में नहीं जानते हैं कि पहले से कोई रिकॉर्ड है, तो आपको शायद अपने प्रोग्राम प्रवाह में थोड़ा पहले जांच करनी होगी। आम तौर पर मैं फ़ंक्शन या डीबी को कॉल के साथ जो कुछ भी शुरू करता हूं और यदि मुझे मौजूदा रिकॉर्ड ऑब्जेक्ट नहीं मिलता है, तो मैं stdClass से नया खाता बना देता हूं।

इसमें दो लाभ हैं: पहला, इसका मतलब है कि आप मौजूदा डेटा के बारे में जानते हैं, इसलिए यदि आप आवश्यकता हो तो आप इसका उपयोग कर सकते हैं और इसे अंधेरे से ओवरराइट नहीं कर सकते हैं। दूसरा: जब आप उस बिंदु पर पहुंच जाते हैं जहां आप डीबी को लिखते हैं, तो आप जानते हैं कि यह INSERT या UPDATE है या नहीं, इस पर आधारित है कि ऑब्जेक्ट में आईडी आईडी है या नहीं।

+0

मैं हर बार दो प्राथमिक कुंजी (कोई भी ऑटो वेतन वृद्धि है) के साथ रिकॉर्ड उत्पन्न करते हैं, तो मैं डीबी में में परीक्षण के बिना रिकॉर्ड की जांच नहीं कर सकता। मुझे लगता है कि सबसे आसान तरीका रिकॉर्ड और डालने को हटाने का सबसे पहले तरीका है। लेकिन मुझे टेबल ओवरहेड के बारे में डर है ... – neworld

+0

क्या आपका मतलब एक समग्र कुंजी है? इससे उल्लिखित विधि में कोई फर्क नहीं पड़ता है। जहां एक वर्ग में फ़ील्ड के उस संयोजन के साथ बस एक चयन करें और देखें कि क्या वापस आता है। क्या आप कुंजी के लिए उपयोग कर रहे हैं, इसके अलावा तालिका में कोई अन्य फ़ील्ड हैं (यानी यह कई से अधिक शामिल टेबल है)? –

+0

मेरे पास एक साधारण सवाल है। इसलिए मैं सार्वभौमिक कार्य स्वयं लिखता हूं, क्योंकि मुझे अक्सर इसकी आवश्यकता होती है। – neworld

1

मैं समारोह अपने आप को लागू किया:

function drupal_write_record2($table, $data, $primaryKeys) { 
    $data = (array)$data; 

    $query = db_select($table) 
     ->fields($table); 

    if (is_array($primaryKeys)) 
     foreach ($primaryKeys as $key) 
     $query->condition($key, $data[$key]); 
    else 
     $query->condition($primaryKeys, $data[$primaryKeys]); 

    $update = (bool)$query->execute()->fetchAssoc(); 

    if ($update) 
     return drupal_write_record($table, $data, $primaryKeys); 
    else 
     return drupal_write_record($table, $data); 
}