2012-06-18 25 views
5

Trong ví dụ dưới đây:DBIx :: Class dụ

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

Các DBIx cookbook nói rằng đây là sql sẽ được tạo:

# 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 

Nhưng từ phần còn lại của sách dạy nấu ăn, tôi đã được dẫn đến tin rằng các truy vấn sẽ chỉ chọn cd. *, trừ khi prefetch khóa học đã được sử dụng như vậy:

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

Dưới đây là tuyên bố khiến tôi tin điều này:

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

Bất cứ ai có thể giải thích cho tôi về những gì tôi đang thiếu ở đây? Hay không? Cảm ơn rất nhiều!

Trả lời

4

Equivalent SQL mâu thuẫn với previous section của sách nấu ăn và trông giống như lỗi.

Tham gia sẽ sử dụng các cột từ các bảng được nối khi thực hiện truy vấn và áp dụng các điều kiện lọc và sắp xếp, nhưng nó sẽ không trả về các cột cho các bảng đã nối. Điều này có nghĩa là nếu bạn làm $cd->artist->name thì bạn sẽ cần thêm SELECT artist.* FROM artist WHERE artist.id = ? để lấy tên nghệ sĩ mỗi lần bạn gọi câu lệnh đó.

Tìm nạp trước được sử dụng để chọn tất cả các cột từ các bảng tìm nạp trước. Sử dụng tìm nạp trước hiệu quả hơn khi bạn thực sự cần các cột đó, ví dụ: vì vậy bạn có thể làm $cd->artist->name mà không cần nó để thực hiện truy vấn bổ sung. Nhưng nếu bạn không cần những cột đó thì bạn có một hit hiệu suất không cần thiết để tải lên dữ liệu đó.

+0

vì vậy trong ví dụ trên sql sẽ được thay đổi thành chỉ "CHỌN cd. *"? – srchulo

+1

cho sql tương đương - đúng vậy – stevenl

Các vấn đề liên quan