gpt4 book ai didi

perl - DBIx::Class 示例

转载 作者:行者123 更新时间:2023-12-04 20:16:53 24 4
gpt4 key购买 nike

在下面的这个例子中:

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

但是从说明书的其余部分,我一直相信查询只会选择 cd.*,除非当然像这样使用预取:
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

任何人都可以向我解释我在这里缺少什么吗?或不?非常感谢!

最佳答案

Equivalent SQLprevious section 相矛盾的食谱,看起来像一个错误。

Join 将在执行查询并应用筛选和排序条件时使用联接表中的列,但它不会返回联接表的列。这意味着如果你这样做 $cd->artist->name那么它将需要它做一个额外的 SELECT artist.* FROM artist WHERE artist.id = ?每次调用该语句时都可以获取艺术家的名字。

预取也用于从预取表中选择所有列。当您确实需要这些列时,使用预取会更有效,例如所以你可以这样做 $cd->artist->name不需要它做额外的查询。但是,如果您不需要这些列,那么加载这些数据就会造成不必要的性能损失。

关于perl - DBIx::Class 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11075943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com