db_update () जोड़ के साथ


9

क्या db_update()निम्नलिखित प्रश्न के लिए कोई रास्ता है ?

UPDATE field_data_field_TEST as ft 
left join node as n on ft.entity_id = n.nid
set n.type='test'
where n.type='foo'

मैंने प्रयोग करने की कोशिश की db_update()->join();लेकिन यह काम नहीं किया।

जवाबों:


12

db_update()किसी भी इंटरफेस है कि join()/ innerJoin()/ आदि को लागू नहीं करता है । इसलिए मुझे लगता है कि आप db_query()क्वेरी स्ट्रिंग को मैन्युअल रूप से उपयोग करने और लिखने के साथ फंस गए हैं।

$sql = "
  UPDATE field_data_field_TEST as ft 
  left join node as n on ft.entity_id = n.nid
  set n.type = :type1
  where n.type = :type2";

$args = array(':type1' => 'test', ':type2' => 'foo');
db_query($sql, $args);

यह एक वर्कअराउंड है, लेकिन ड्रूपल डॉक्यूमेंटेशन में वे कहते हैं "INSERT, UPDATE, या DELETE प्रश्नों के लिए इस फ़ंक्शन का उपयोग न करें। उन्हें क्रमशः db_insert (), db_update () और db_delete () के माध्यम से नियंत्रित किया जाना चाहिए।" इसलिए मुझे लगता है कि एक उपश्रेणी को लागू करना शायद कम प्रदर्शन होगा लेकिन अधिक सही ढंग से। तुम क्या सोचते हो ?
ivan 12

2
मैं उस दस्तावेज़ को एक चुटकी नमक के साथ ले जाऊँगा ... अगर DBTNG एक मौजूदा वर्ग के साथ आपके द्वारा आवश्यक क्वेरी नहीं कर सकता है, तो यह उपयोग करने के लिए पूरी तरह से स्वीकार्य है db_query()। यदि आप प्रलेखन से सख्ती से चिपके रहना चाहते हैं तो निश्चित रूप से, एक उपश्रेणी के साथ एक शर्त एक विकल्प होगा। लेकिन जैसा कि आप कहते हैं, यह कम परफ़ॉर्मर होगा और मेरे लिए एक सीधी सीक्वल क्वेरी का उपयोग करने की तुलना में कोई 'बेहतर' नहीं है
क्लाइव

बस यह देखते हुए ड्रुपल 8 में भी ऐसा प्रतीत होता है, Updateकिसी भी joinकार्य को लागू नहीं करता है, फिर भी इस मामले के लिए सामान्य क्वेरी का उपयोग करने की आवश्यकता है।
डेविड थॉमस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.