2012-06-18 18 views
5

नीचे इस उदाहरण में:DBIx :: कक्षा उदाहरण

my $rs = $schema->resultset('CD')->search(
{ 
    'artist.name' => 'Bob Marley' 
    'liner_notes.notes' => { 'like', '%some text%' }, 
}, 
{ 
    join  => [qw/ artist liner_notes /], 
    order_by => [qw/ artist.name /], 
} 
); 

DBIx cookbook का कहना है कि इस एसक्यूएल कि उत्पन्न हो जाएगा है:

# Equivalent SQL: 
# SELECT cd.*, artist.*, liner_notes.* FROM cd 
# JOIN artist ON cd.artist = artist.id 
# JOIN liner_notes ON cd.id = liner_notes.cd 
# WHERE artist.name = 'Bob Marley' 
# ORDER BY artist.name 

लेकिन रसोई की किताब के बाकी हिस्सों से, मैं यह मानने के लिए नेतृत्व किया गया है कि क्वेरी केवल सीडी। * का चयन करेगी, जब तक कि निश्चित रूप से प्रीफ़ेच का उपयोग नहीं किया जाता था:

my $rs = $schema->resultset('CD')->search(
{ 
    'artist.name' => 'Bob Marley' 
    'liner_notes.notes' => { 'like', '%some text%' }, 
}, 
{ 
    join  => [qw/ artist liner_notes /], 
    order_by => [qw/ artist.name /], 
    prefetch => [qw/ artist liner_notes/], 
} 
); 
[Prefetch] allows you to fetch results from related tables in advance 

किसी को भी या तो मैं यहाँ क्या याद कर रहा हूँ मुझे समझा सकता है:के नीचे बयान की ओर जाता है कि मुझे इस पर विश्वास करना है? या नहीं? आपका बहुत बहुत धन्यवाद!

उत्तर

4

Equivalent SQL रसोई की किताब की previous section के विपरीत है और एक त्रुटि तरह दिखता है।

क्वेरी करने और फ़िल्टर और सॉर्टिंग स्थितियों को लागू करते समय शामिल तालिकाओं से कॉलम का उपयोग करेगा, लेकिन यह शामिल तालिकाओं के लिए कॉलम वापस नहीं करेगा। इसका अर्थ यह है कि यदि आप $cd->artist->name करते हैं तो उसे कलाकार के नाम प्रत्येक बार प्राप्त करने के लिए अतिरिक्त SELECT artist.* FROM artist WHERE artist.id = ? करने की आवश्यकता होगी, आप उस कथन को कॉल करते हैं।

प्रीफेच का उपयोग प्रीफेच टेबल से सभी कॉलम का चयन करने के लिए भी किया जाता है। जब आपको वास्तव में उन कॉलम की आवश्यकता होती है तो प्रीफेच का उपयोग करना अधिक कुशल होता है, उदा। तो आप अतिरिक्त क्वेरी करने के लिए $cd->artist->name कर सकते हैं। लेकिन अगर आपको उन कॉलमों की आवश्यकता नहीं है तो आपके पास उस डेटा को लोड करने के लिए एक अनावश्यक प्रदर्शन हिट है।

+0

तो एसक्यूएल के ऊपर उदाहरण में केवल "चयन सीडी। *" में बदला जाएगा? समकक्ष एसक्यूएल के लिए – srchulo

+1

- यह सही है – stevenl

संबंधित मुद्दे