2012-06-18 5 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 говорит, что это SQL, который будет сгенерирован:

# 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 поваренной книги и выглядит как ошибка.

Join будет использовать столбцы из объединенных таблиц при выполнении запроса и применении условий фильтра и сортировки, но он не будет возвращать столбцы для объединенных таблиц. Это означает, что если вы сделаете $cd->artist->name, тогда ему понадобится дополнительно SELECT artist.* FROM artist WHERE artist.id = ?, чтобы получить имя художника каждый раз, когда вы вызываете это утверждение.

Предварительная выборка также используется для выбора всех столбцов из таблиц предварительной выборки. Эффективно использовать предварительную выборку, когда вам действительно нужны эти столбцы, например. поэтому вы можете сделать $cd->artist->name, не требуя этого, чтобы выполнить дополнительный запрос. Но если вам не нужны эти столбцы, то у вас есть ненужное поражение производительности для загрузки этих данных.

+0

так что в примере выше sql будет изменен только на «SELECT cd. *»? – srchulo

+1

для эквивалентного sql - это правильно – stevenl