3

我正在为相当基本的 DBIx-Class 预取使用而苦苦挣扎。我想限制使用预取时从连接表返回的列。

这:

my $rs = $schema->resultset('CD')->search(
  {}, # No searching restrictions through WHERE clause
  {
    prefetch => [qw/ artist /],
    columns  => [qw/ title artist.name /],
  }
);

生成此 SQL:

SELECT cd.title, artist.*
FROM cd
JOIN artist ON cd.artist = artist.id

但是我不想删除所有的艺术家列,只删除 cd.title 和 Artist.name 列(在这个例子中,我的实际用例更复杂)。列功能似乎只适用于主表而不是连接表。

我想要这个 SQL:

SELECT cd.title, artist.name
FROM cd
JOIN artist ON cd.artist = artist.id

我只是在使用 Catalyst/DBIx-Class 获得我的海腿,所以我可能在这里忽略了一些非常明显的东西!

4

3 回答 3

3

是的你是对的。您只能选择主表中的列,而无法获取联接表中的特定列。你需要的是加入。使用 join 和 '+select','+as' 属性,可以从两个表中选择特殊列。

预取也用于从预取表中选择所有列。当您实际需要这些列时,使用预取会更有效,例如,您可以执行 $cd->artist->name 而不需要它来执行附加查询。但是,如果您不需要这些列,那么加载该数据就会对性能造成不必要的影响。

于 2013-11-05T10:50:37.947 回答
2

版本 0.08250DBIx::Class支持预取列的子集。现在您可以使用和新属性编写查询join,其工作方式如下:columnscollapseprefetch

my $rs = $schema->resultset('CD')->search(
  {},
  {
    join     => [qw/ artist /],
    columns  => [qw/ title artist.name /],
    collapse => 1,
  }
);
于 2013-11-14T01:24:41.583 回答
1

额外的。如果要为嵌套连接指定列(2 级或更多),则需要使用散列格式指定列,以便 DBIx 可以解析要应用于列的关系。

例子:

    my $rs = $schema->resultset('CD')->search(
      {},
      {
        join     => { 'artist' => { 'agent' => 'publisher' } },
        columns  => [qw/ title artist.name artist.agent.publisher_id /, 
                        { 'artist.agent.publisher.publisher_name' => 'publisher.publisher_name' } ],
        collapse => 1,
      }
    );
于 2015-01-15T16:28:59.987 回答