PHP में प्रोग्रामिंग करते समय मैं हमेशा अर्थपूर्ण 'मॉडल' (कक्षाएं) बनाने की कोशिश करता हूं जो डेटाबेस में तालिकाओं से मेल खाते हैं। मुझे अक्सर निम्नलिखित समस्या का सामना करना पड़ता है:स्वच्छ ओओ-संरचना बनाम एसक्यूएल प्रदर्शन
मान लीजिए कि मैंने दो तालिकाओं के साथ डेटाबेस बनाया है: authors
और blogs
, दोनों मेरे आवेदन में एक समान मॉडल है।
मान लीजिए कि मैं लेखक के बारे में जानकारी के साथ-साथ सभी ब्लॉगों प्रिंट करना चाहते हैं, मैं इस तरह कुछ करने के लिए चाहते हैं:
<?php
foreach ($app->getBlogs() as $blog) {
echo "<h1>" . $blog->title . "</h1>";
echo "Written by" . $blog->getAuthor()->name . "</p>";
// ... et cetera
}
?>
समस्या यह है कि आवेदन होगा अब आग 1 SQL क्वेरी के लिए प्रत्येक लेखक के लिए जानकारी प्राप्त करने के लिए सभी ब्लॉग आइटम, और [ब्लॉग आइटम की संख्या] प्रश्न प्राप्त करें। इस्तेमाल किया सरल एसक्यूएल होने मैं एक साधारण क्वेरी का उपयोग कर इस जानकारी को पुनः प्राप्त किया जा सकता था:
SELECT * FROM blogs
JOIN authors ON authors.id = blogs.author
इस तरह के मुद्दों से निपटने का सबसे अच्छा तरीका क्या है: बहुत से बेकार एसक्यूएल प्रश्नों को क्रियान्वित करने के बिना एक वस्तु उन्मुख आवेदन का विकास।
कुछ प्रकार के समाधान मैंने खुद के बारे में सोचा है लेकिन मुद्दा यह है: लेखक की ऑब्जेक्ट की आवश्यकता होने पर मुझे पहले से पता नहीं है, $ ब्लॉग-> getAuthor() को कभी भी कॉल नहीं किया जा सकता है लेकिन मैं पुनः प्राप्त कर लिया होता बशर्ते समाधान के साथ जानकारी। – Thijs
आप जो पूछ रहे हैं वह असंभव है। आप मूल रूप से उस कोड के लिए पूछ रहे हैं जो किसी भी तरह से पहले से जानता है कि आप क्या उपयोग करने जा रहे हैं। आपको इसे खुद को हार्डकोड करना होगा; आपको या तो आलसी लोडिंग चुननी है, जो कि यदि आप केवल कुछ लेखकों को चाहते हैं, लेकिन सभी नहीं, या बैच लोडिंग, जैसा ऊपर वर्णित है, तो कुशल है, यदि आपको कई लेखकों की आवश्यकता है तो यह कुशल है। आप दोनों नहीं हो सकता है। – ryeguy
इंटेक में हम जिस ओआरएम टूल का उपयोग करते हैं, वह (ए) एक लेखक को खींचने के लिए कक्षाएं उत्पन्न करता है और अन्य (बी) लेखकों के संग्रह को खींचने के लिए। तो मैं आसानी से कह सकता था "मुझे उन सभी लेखकों को प्राप्त करें जिनके पास पहले नाम में अक्षर 'एम' है या लगभग कुछ भी है। हालांकि, दोनों (ए) और (बी) पूरे लेखक को खींचते हैं, इसलिए सभी फ़ील्ड तार भर जाते हैं। यदि आप किसी विशेष मामले के लिए केवल एक फ़ील्ड चाहते थे, या यदि आपको असामान्य शामिल होने की आवश्यकता है, तो आपको इसे स्वयं लिखना होगा। जो ठीक है मैं gen'd कोड का 90% समय का उपयोग करता हूं। –