2011-01-10 13 views
6

सिद्धांत (1.2) के बजाय WHERE IN का उपयोग क्यों करता है?सिद्धांतों का उपयोग LIMIT के बजाय कहां किया जाता है?

इस कोड:

Doctrine_Query::create() 
    ->from('Table t') 
    ->limit(10) 
    ->getSqlQuery(); 

इस तरह रिटर्न कुछ:

SELECT t.id_table AS t__id_table FROM table AS t WHERE t__id_table IN (1,2,3,4,10,12,18,20,21,25); 
इसके बजाय इस बात का

:

SELECT t.id_table AS t__id_table FROM table AS t LIMIT 10; 

यह behaivor किसी भी LIMIT मूल्य के लिए एक ही है। यह उच्च LIMIT मानों के लिए बहुत लंबे प्रश्न उत्पन्न करता है।

बोनस प्रश्न: सिद्धांत कैसे जानता है, किस आईडी का उपयोग करना है? (डीबी को एक और प्रश्न भेजकर ??)

+0

आप किस डेटाबेस बैकएंड का उपयोग कर रहे हैं? –

+0

@ मैट गिब्सन: MySQL –

+0

विषम; मैंने सिम्फनी 1.4 के सिद्धांत के साथ कुछ ऐसा ही किया है, जिसे मैं _think_ संस्करण 1.2.3 है, और यह मेरी अपेक्षा के अनुसार, MySQL के लिए LIMIT क्लॉज का उपयोग करता है। –

उत्तर

4

ऐसा इसलिए है क्योंकि LIMIT डाटाबेस पंक्तियों पर "ऑब्जेक्ट्स" पर काम नहीं करता है। जब आप $q->limit(10) टाइप करते हैं तो आप दस ऑब्जेक्ट प्राप्त करना चाहते हैं, डेटाबेस से दस पंक्तियां नहीं।

पर विचार करें क्वेरी निम्नलिखित (उत्पादों और श्रेणियों के कई-से-अनेक संबंध हैं):

SELECT p.*, c.* FROM product p 
INNER JOIN product_category_ref pcr ON p.id = pcr.prodcut_id 
INNER JOIN category c ON c.id = pcr.category_id 
WHERE p.price < 123; 

10 उत्पादों (वस्तुओं) आपकी क्वेरी कम से कम 20 पंक्तियों को लाने के लिए होगा लाने के लिए। आप LIMIT 10 कारण (उदाहरण के लिए) का उपयोग नहीं कर सकते हैं केवल 3 उत्पादों को वापस कर दिया जाएगा। यही कारण है कि आपको यह पता लगाने की आवश्यकता है कि कौन से उत्पादों को लाया जाना चाहिए (सीमाएं उत्पादों पर लागू होती हैं), और बाद में वास्तविक डेटा प्राप्त करें।

कि निम्नलिखित प्रश्नों में परिणाम होगा:

SELECT p.id FROM product p WHERE p.price < 123; 
SELECT ..... WHERE p.id IN (...); 

दूसरा क्वेरी 20, 423 या 31 पंक्तियों को वापस हो सकता है। जैसा कि आप देख सकते हैं कि यह limit() से कोई मान नहीं है।

पीएस। उस मामले में Doctrine2 अधिक स्पष्ट है क्योंकि यह के बजाय setMaxResults() विधि का उपयोग कर रहा है जो कम भ्रमित है।

+0

आपको यह जानकारी कहां से मिलती है? मैन्युअल सीमा के अनुसार() डीक्यूएल का हिस्सा है और हाइड्रेशन –

+0

से पहले इसका उपयोग किया जाता है, मुझे पता है कि मेरे अपने विस्तार और स्रोतों के अध्ययन से। और हाँ, आप सही हैं - 'LIMIT' डीक्यूएल का हिस्सा है ('सीमा()' विधि' क्वेरीब्यूल्डर 'से आती है) और जैसा कि आप देख सकते हैं कि इसका उपयोग हाइड्रेशन से पहले किया जाता है (दूसरी क्वेरी (जो वास्तव में हाइड्रेटेड है) 'LIMIT' क्लॉज भी नहीं है))। – Crozin

+0

यह मेरे लिए अजीब लगता है। मैं (और मेरे कॉलेग्यूज) ने सोचा था कि एलआईटीई पंक्तियों की संख्या पर लागू होती है जो क्वेरी द्वारा लौटाई जाती है (प्रक्रिया में सभी शामिल होने के बाद, सबक्वायरी इत्यादि)। –

0

सिद्धांत 1.2.3 का उपयोग करना:

SELECT t.id_table AS t__id_table FROM table t LIMIT 10 

वहाँ शायद कुछ और अपने कोड में चल रहा है:

<?php 

include(dirname(__FILE__).'/Doctrine.php'); 
spl_autoload_register(array('Doctrine', 'autoload')); 

$dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'testdb', 'testdb'); 
$conn = Doctrine_Manager::connection($dbh); 

class Table extends Doctrine_Record { 
    public function setTableDefinition() { 
    $this->hasColumn('id_table', integer, 10, array('primary' => true)); 
    } 
} 

$q = Doctrine_Query::create() 
    ->from('Table t') 
    ->limit(10) 
    ->getSqlQuery(); 

echo $q; 

मैं परिणाम प्राप्त?

+0

हमें अभी पता चला है कि जॉइन का उपयोग करते समय केवल इनका उपयोग किया जाता है। भ्रमित करने के लिए क्षमा करें। –