MODx क्रांति में उपयोगकर्ता डेटाबेस क्वेरी

यह विषय निश्चित रूप से उन लोगों के लिए उपयोगी होगा जिनके पास बड़ी MODx क्रांति परियोजनाएं हैं, क्योंकि मानक व्यवसाय कार्ड साइटों में पर्याप्त मानक कार्य विधियां एक ला $ modx-> getObject () , $ modx-> getCollection () , आदि हैं। । और ये विधियां अनिवार्य रूप से न केवल एक डेटाबेस के साथ काम कर रही हैं, बल्कि MODx वस्तुओं के साथ भी हैं।

जब बड़ी परियोजनाओं के साथ काम करते हैं, तो एक ला $ modx-> getCollection () दो साल के लिए हमारे लिए सबसे अच्छा समाधान नहीं है:
1. संसाधनों का अति प्रयोग। ये तरीके न केवल डेटाबेस से डेटा प्राप्त करते हैं, बल्कि प्राप्त वस्तुओं के उदाहरण भी बनाते हैं। इस मामले में, 10,000 दस्तावेजों के बारे में जानकारी प्राप्त करने पर, हमें 10,000 modResource ऑब्जेक्ट मिलते हैं, जो बहुत अच्छा नहीं है।
2. परिणामी अभिलेखों को गिनने का कार्य जटिल है। क्वेरी स्तर पर गणना की प्रत्यक्ष कठिनाइयों के अलावा, भले ही आपको एक ही दस्तावेज़ के 10 रिकॉर्ड मिलते हैं (उदाहरण के लिए), MODx परिणामस्वरूप केवल एक modResource ऑब्जेक्ट लौटाएगा। और यद्यपि अक्सर यह कई प्रोग्रामर (वे अद्वितीय वस्तुओं को प्राप्त करते हैं और खुश होते हैं) के अनुरूप होंगे, यह किसी के अनुरूप नहीं होगा, क्योंकि फिर से संसाधनों की निगरानी होती है, और अंतिम परिणाम से यह तुरंत स्पष्ट नहीं होता है कि अनुरोध अनुकूलित नहीं है।
इसके अलावा, जब बड़ी परियोजनाओं पर काम करते हैं, तो हमें सबसे अधिक बार वस्तुओं की आवश्यकता नहीं होती है, लेकिन केवल जानकारी (डेटाबेस से रिकॉर्ड)।

यहाँ वर्णित डेटाबेस के साथ काम करने की विधियाँ
1. डेटाबेस क्वेरी लिखने में अधिक लचीलापन दें।
2. मानक xPDO विधियों का पालन करें, अर्थात, शुद्ध SQL से बचें, क्योंकि शुद्ध SQL किसी कारण से चौखटों में कोषेर नहीं है (कम से कम संभावित माइग्रेशन के दृष्टिकोण से दूसरे प्रकार के डेटाबेस में, तालिका के नाम, प्रस्तावना, या कुछ और परिवर्तन)

तो बात है।

पहले हमें एक महत्वपूर्ण विधि सीखने की जरूरत है
$modx->newQuery($class); 


MODx में सभी प्रश्नों का निर्माण करने के लिए, आपको हमेशा कम से कम एक आधार वर्ग की आवश्यकता होती है जिसमें से पूरी क्वेरी नाचेगी।

यहाँ एक और अधिक विस्तृत उदाहरण है:
 $q = $modx->newQuery('modResource'); $q->where(array( 'context_key' => 'web' )); $result = $modx->getCollection('modResource', $q); 


इस मामले में, $ q तथाकथित मानदंड है जो हम अक्सर प्रलेखन में पाते हैं।
यह लगभग वैसा ही है जैसा कि जब हम इसे दूसरे पैरामीटर के रूप में पास करते हैं, तो यह केवल एक अधिक शक्तिशाली उपकरण है, क्योंकि इसमें कई महत्वपूर्ण तरीके हैं जैसे कि Sortby, leftJoin, innerJoin, Limit और अन्य।

अब हमें सिर्फ वही मिला, जिसके साथ हम लड़ने जा रहे थे, यानी आउटपुट में हमें कई modResource ऑब्जेक्ट मिले। बस इस परिचित उदाहरण से, हमारे लिए अपने लक्ष्य पर आगे बढ़ना आसान होगा।

तो, थोड़ा हमारे अनुरोध को फिर से करें।
 $q = $modx->newQuery('modResource'); $q->where(array( 'context_key' => 'web' )); $q->prepare(); $sql = $q->toSQL(); 


यहां हमें पहले से ही शुद्ध एसक्यूएल मिलता है, जिसके लिए कईयों की जरूरत होगी।
इस उदाहरण में, हमने एक और महत्वपूर्ण तरीका देखा।
 $q->prepare(); 

वह अंतिम एसक्यूएल तैयार कर रहा है।

अब हम इस SQL ​​को निष्पादित कर सकते हैं
 $q = $modx->newQuery('modResource'); $q->where(array( 'context_key' => 'web' )); $q->limit(10); //    $q->prepare(); $sql = $q->toSQL(); $query = $modx->prepare($sql); $query->execute(); $result = $query->fetchAll(PDO::FETCH_ASSOC); print_r($result); 


UPD: मैं इस उदाहरण को डेमो $ modx-> तैयार ($ sql) के रूप में छोड़ूंगा; लेकिन इसके तुरंत बाद एक कॉल के साथ सही उदाहरण देखें -> तैयार ();
 $q = $modx->newQuery('modResource'); $q->where(array( 'context_key' => 'web' )); $q->limit(10); //    $q->prepare(); $q->stmt->execute(); $result = $q->stmt->fetchAll(PDO::FETCH_ASSOC); print_r($result); 


आउटपुट पर, हमें सिर्फ डेटा ऐरे मिलता है।
लेकिन कॉलम में ला नाम बहुत अच्छे नहीं होंगे
[modResource_id] => 0
[modResource_type] => दस्तावेज़

इसे स्पष्ट करने के लिए, क्वेरी में एक स्पष्ट चयन जोड़ें।
 $q = $modx->newQuery('modResource'); $q->where(array( 'context_key' => 'web' )); $q->select(array( 'modResource.*' )); $q->limit(10); $q->prepare(); $q->stmt->execute(); $result = $q->stmt->fetchAll(PDO::FETCH_ASSOC); print_r($result); 


अब कॉलम नामों के साथ सब कुछ ठीक है :-)

और अब एक उपयोगी और उदाहरण के लिए उदाहरण: 1/20 की शिफ्ट के साथ 1/10 रिकॉर्ड प्राप्त करें और आईडी द्वारा छाँटें।
 $q = $modx->newQuery('modResource'); $q->where(array( 'context_key' => 'web' )); $q->select(array( 'modResource.*' )); //     $total = $modx->getCount('modResource', $q); //   1/10     //   1/20 (offset) $q->limit($total / 10, $total / 20); //    ID    $q->sortby('id', 'DESC'); $q->prepare(); $q->stmt->execute(); $result = $q->stmt->fetchAll(PDO::FETCH_ASSOC); print_r($result); 


वैसे, इन उदाहरणों को बदलना बहुत आसान है ताकि अंतिम वस्तुओं को प्राप्त किया जा सके।

 $q = $modx->newQuery('modResource'); $q->where(array( 'context_key' => 'web' )); $q->select(array( 'modResource.*' )); //     $total = $modx->getCount('modResource', $q); //   1/10     //   1/20 (offset) $q->limit($total / 10, $total / 20); //    ID    $q->sortby('id', 'DESC'); $q->prepare(); //   $docs = $modx->getCollection('modResource', $q); 


विधियों का सार $ modx-> getObject () और $ modx-> getCollection () डेटाबेस से डेटा प्राप्त करना है, निर्दिष्ट वर्ग को आरंभ करना और प्राप्त डेटा को विधि $ ऑब्जेक्ट का उपयोग करके उसमें सामान करना है - fromArray ($ array ());

वैसे, मैं दृढ़ता से print_r ($ डॉक्स) के साथ खेलने के खिलाफ सलाह देता हूं, क्योंकि ला $ modx-> getCollection () विधियों के परिणामस्वरूप निर्दिष्ट वस्तुओं की एक सरणी है, जिनमें से प्रत्येक एक विस्तारित xPDO और MODx ऑब्जेक्ट संयुक्त है, अर्थात, यह बहुत ज्यादा है जानकारी।
इसलिए, वस्तुओं से जानकारी का उत्पादन करने के लिए, $ ऑब्जेक्ट का उपयोग करें-> toArray () विधि;
इस मामले में, कुछ इस तरह:
 foreach($docs as $doc){ print_r($doc->toArray()); } 


एक और ध्यान दें: MODx ऑब्जेक्ट्स के एरे में तत्वों को क्रम से बाहर सूचीबद्ध किया गया है, और प्रत्येक कुंजी ऑब्जेक्ट की आईडी (रिकॉर्ड) है, इसलिए आप $ 11 डॉक्स [10] के माध्यम से 11 वें तत्व को निश्चित रूप से संदर्भित नहीं कर सकते, क्योंकि आईडी 10 के साथ एक दस्तावेज हो सकता है। 1, या 100 वां, या यह बिल्कुल नहीं हो सकता है, हालांकि सरणी में 100 दस्तावेज होंगे।
आप इस निष्कर्ष को पुनः प्राप्त करके अपने लिए देख सकते हैं
 foreach($docs as $id => $doc){ print "<br />". $id; } 


MODx ऑब्जेक्ट्स के सरणियों के साथ काम करने के लिए, यहां वर्णित सरणियों के तत्वों के साथ काम करने के तरीकों का अध्ययन करना बहुत उपयोगी है

अंत () - एक सरणी के आंतरिक पॉइंटर को उसके अंतिम तत्व पर सेट करता है
कुंजी () - एक सरणी से एक कुंजी का चयन करता है
प्रत्येक () - सरणी से वर्तमान कुंजी / मान जोड़ी लौटाता है और इसके पॉइंटर को शिफ्ट करता है
prev () - सरणी के आंतरिक पॉइंटर को एक स्थिति में वापस ले जाता है
रीसेट () - एक सरणी के आंतरिक पॉइंटर को इसके पहले तत्व पर सेट करता है
अगला () - सरणी के आंतरिक पॉइंटर को एक स्थिति आगे बढ़ाता है

उदाहरण के लिए, यदि हम MODx सरणी से पहला तत्व प्राप्त करना चाहते हैं, तो हम $ doc = $ डॉक्स तक नहीं पहुँच सकते [0]; 99.9% में, आपको कुछ भी नहीं मिलेगा, क्योंकि आईडी = 0 के रिकॉर्ड लगभग कभी उपयोग नहीं किए जाते हैं।
इस तरह से सही ढंग से संभाल: $ doc = current ($ doc);

जो लोग इस पद्धति को पसंद करते हैं, वे शायद इस तरह से कई तालिकाओं से अधिक जटिल प्रश्नों का निर्माण करेंगे।

पुनश्च उपयोगी फिल्टर के एक जोड़े के साथ एक छोटी सी टीम का अनुरोध।
हम वेब और एमजीआर संदर्भों से सभी सेटिंग्स प्राप्त करते हैं जिनके मूल्य शून्य नहीं हैं और! = ''

 $q = $modx->newQuery('modContext'); $where = array( 'modContext.key:in' => array('web', 'mgr'), 'cs.value:!=' => NULL, 'cs.value:!=' => '', ); $q->select(array( 'modContext.key', 'cs.key as setting_key', 'cs.value' )); $q->innerJoin('modContextSetting', 'cs', 'cs.context_key = modContext.key'); $q->where($where); $q->prepare(); $q->stmt->execute(); $result = $q->stmt->fetchAll(PDO::FETCH_ASSOC); print_r($result); 

Source: https://habr.com/ru/post/In152123/


All Articles