2012-06-18 33 views
5

En este ejemplo a continuación:DBIx :: ejemplo Clase

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

El DBIx cookbook dice que este es el SQL que se generarán:

# 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 

Pero desde el resto del libro de cocina, me han estado llevan a creer que la consulta sólo se seleccionaría cd *, a menos que por supuesto captación previa se utilizó como tal:.

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

A continuación se muestra la afirmación de que me lleva a creer esto:

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

Puede alguien explicarme bien lo que me falta aquí? ¿O no? ¡Muchas gracias!

Respuesta

4

El Equivalent SQL contradice el previous section del libro de cocina y parece un error.

se incorporen a utilizar las columnas de las tablas unidas al realizar la consulta y la aplicación del filtro y clasificación de las condiciones, pero no va a devolver las columnas de las tablas combinadas. Esto significa que si lo hace $cd->artist->name entonces se tendrá que hacer un adicional SELECT artist.* FROM artist WHERE artist.id = ? para obtener el nombre del artista cada vez se llama a esa declaración.

Prefetch se utiliza para seleccionar todas las columnas de las tablas de recuperación previa también. Es más eficiente usar captación previa cuando realmente necesita esas columnas, p. para que pueda hacer $cd->artist->name sin necesidad de hacer la consulta adicional. Pero si no necesita esas columnas, entonces tiene un golpe de rendimiento innecesario para cargar esos datos.

+0

así en el ejemplo anterior, el SQL sería cambiado a simplemente "seleccionar CD. *"? – srchulo

+1

para el sql equivalente - eso es correcto – stevenl

Cuestiones relacionadas