2012-06-18 9 views
5

In questo esempio qui sotto:DBIx :: Class esempio

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 /], 
} 
); 

Il DBIx cookbook dice che questa è la SQL che verrà generato:

# 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 

Ma dal resto del libro di cucina, ho Sono stato portato a credere che la query avrebbe selezionato solo cd. *, a meno che ovviamente fosse usato prefetch in questo modo:

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/], 
} 
); 

Di seguito è riportata la dichiarazione che mi porta a credere:

[Prefetch] allows you to fetch results from related tables in advance 

Qualcuno può spiegarmi o cosa mi manca qui? O no? Molte grazie!

risposta

4

Il Equivalent SQL contraddice lo previous section del libro di cucina e sembra un errore.

Join utilizzerà le colonne delle tabelle unite durante l'esecuzione della query e l'applicazione delle condizioni di filtro e ordinamento, ma non restituirà le colonne per le tabelle unite. Ciò significa che se lo fai, $cd->artist->name, allora avrà bisogno di fare un ulteriore per ottenere il nome dell'artista ogni volta che chiami quella frase.

Prefetch è utilizzato per selezionare tutte le colonne anche dalle tabelle di precaricamento. È più efficiente usare il prefetch quando hai effettivamente bisogno di quelle colonne, ad es. quindi puoi fare $cd->artist->name senza aver bisogno di fare la query aggiuntiva. Ma se non hai bisogno di quelle colonne, hai un colpo di prestazioni non necessario per caricare quei dati.

+0

quindi nell'esempio sopra lo sql verrebbe modificato in "SELECT cd. *"? – srchulo

+1

per l'equivalente sql: giusto – stevenl

Problemi correlati