मुझे नहीं लगता कि Zend_Db एकाधिक पंक्तियों को सम्मिलित करने का समर्थन करता है।
लेकिन अगर आपके पास सिर्फ दो पंक्तियाँ हैं या थोड़ी अधिक हैं तो आप केवल एक लूप का उपयोग कर सकते हैं।
foreach ($data as $row)
{
$db->insert('table', $row)
}
बिल कार्विन , एक पूर्व Zend फ्रेमवर्क डेवलपर ने यह कुछ समय पहले नेबल पर :
रोसेट मूल रूप से एक संग्रह वस्तु है, इसलिए मैं उस वर्ग में विधियों को जोड़ूंगा ताकि पंक्तियों को सेट में जोड़ा जा सके। तो आपको यह करने में सक्षम होना चाहिए:
// creates a rowset collection with zero rows
$rowset = $table->createRowset();
// creates one row with unset values
$row = $table->createRow();
// adds one row to the rowset
$rowset->addRow($row);
// iterates over the set of rows, calling save() on each row
$rowset->save();
एन खाली पंक्तियों को बनाने के लिए createRowset() को पूर्णांक पास करने का कोई मतलब नहीं है। वैसे भी मूल्यों के साथ उन्हें पॉप्युलेट करने के लिए आपको बस उनके माध्यम से पुन:प्रयास करना होगा। तो आप एप्लिकेशन डेटा के साथ अलग-अलग पंक्तियों को बनाने और पॉप्युलेट करने के लिए एक लूप भी लिख सकते हैं, और फिर उन्हें संग्रह में जोड़ सकते हैं।
$rowset = $table->createRowset();
foreach ($appData as $tuple)
{
$row = $table->createRow($tuple);
$rowset->addRow($row);
}
$rowset->save();
यह समझ में आता है कि सरणियों की एक सरणी को createRowset () में पारित करने की अनुमति दी जाती है, क्योंकि यह createRow () को टपल पास करने के उपयोग के अनुरूप होगा।
$rowset = $table->createRowset($appData); // pass array of tuples
यह पिछले उदाहरण के समान लूप निष्पादित करेगा (अंत में सेव() को छोड़कर), नई पंक्तियों की एक नई पंक्ति बनाना, सहेजने के लिए तैयार () डी।
SQL में डेटा डालने की दक्षता में सुधार करने के दो तरीके हैं:
-
एकाधिक पंक्तियों के साथ एक INSERT कथन का उपयोग करें:
t (col1, col2, col3) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9) में डालें;
-
INSERT स्टेटमेंट तैयार करें और इसे कई बार निष्पादित करें:
t (col1, col2, col3) VALUES (?, ?, ?) में सम्मिलित करें तैयार करें; 1, 2, 3EXECUTE 4, 5, 6EXECUTE 7, 8, 9
हालाँकि, इनमें से किसी भी सुधार का समर्थन करने से Row और Rowset कक्षाओं में जटिलता बढ़ जाएगी। यह आंतरिक तरीके के कारण है कि वर्तमान Zend_Db_Table_Row वर्ग एक पंक्ति के बीच अंतर करता है जिसे जब आप सेव () कहते हैं, तो इसे INSERTed या UPDATEd करने की आवश्यकता होती है। यह भेद रो ऑब्जेक्ट द्वारा समझाया गया है, इसलिए रोसेट को यह नहीं पता है कि अलग-अलग पंक्तियां नई पंक्तियां हैं या मौजूदा पंक्तियों की संशोधित प्रतियां हैं। इसलिए Rowset वर्ग के लिए एक बहु-पंक्ति सेव () विधि की पेशकश करने के लिए जो अधिक कुशल SQL का उपयोग करता है, गंदे डेटा के प्रबंधन को पूरी तरह से दोबारा करना होगा। आसान उपाय यह है कि रोसेट अपनी पंक्तियों पर पुनरावृति करे, हर एक पर सेव () को कॉल करे। यह ओओ एनकैप्सुलेशन के लिए बेहतर है, हालांकि यह रोसेट डालने के लिए एसक्यूएल को अनुकूलित करने में मदद नहीं करता है।
किसी भी मामले में, एक विशिष्ट वेब अनुरोध में डेटा की कई पंक्तियों को बल्क-लोड करना वास्तव में दुर्लभ है, जब कुशल SQL की सबसे बड़ी आवश्यकता होती है। पंक्तियों की एक छोटी संख्या के लिए दक्षता में अंतर छोटा है, इसलिए यह केवल तभी ध्यान देने योग्य सुधार होगा जब आप बड़ी संख्या में पंक्तियों को लोड कर रहे हों। यदि ऐसा है, तो आपको वैसे भी INSERT का उपयोग नहीं करना चाहिए, यदि आप किसी अन्य RDBMS ब्रांड का उपयोग करते हैं, तो आपको MySQL के LOAD DATA स्टेटमेंट या समकक्ष सुविधा का उपयोग करना चाहिए। बहुत सारे डेटा लोड करने के लिए INSERT आमतौर पर सबसे कुशल विकल्प नहीं है।
स्वत:जेनरेट की गई चाबियों को वापस करने के संबंध में, मैं परेशान नहीं होता। ध्यान दें कि यदि आप सादे SQL (उदाहरण के लिए mysql CLI में) का उपयोग करते हैं, और आप एक INSERT कथन में कई पंक्तियाँ सम्मिलित करते हैं, तो आप केवल अंतिम जनरेट किया गया id मान प्राप्त कर सकते हैं, न कि सम्मिलित सभी पंक्तियों के लिए id मान। यह एसक्यूएल व्यवहार है; यह किसी भी भाषा या किसी भी ढांचे के लिए सही है।
INSERT INTO t (col1, col2, col3) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);
SELECT LAST_INSERT_ID(); -- returns only the id for the third tuple
यदि आपको प्रत्येक पंक्ति के लिए आईडी की आवश्यकता है, तो आपको एक लूप लिखना चाहिए और पंक्तियों को एक बार में सम्मिलित करना चाहिए, प्रत्येक पंक्ति डालने के बाद उत्पन्न आईडी को पुनः प्राप्त करना चाहिए।