DBIC - 在保持has_many关系的同时选择"prefetch"中的特定列



我有两个'Artist' has_many 'CD'的表。

我想取"艺术家"one_answers"cd",并使用HashRefInflator获得类似(JSON格式)的东西我使用HashRefInflator

     [ {
        
        "artist_name": "Dummy",
        "artist_id": "1",
            "cds": [{
            "cd_id": "1,
            "cd_desc": "Dummy",
            }],
         },
      ]

当我使用

$schema->resultset('Artist')->search({}, 
                                       {
                                         prefetch => 'cds',
                                       });

我得到结果"EXTRA"从CD表中取出列。我希望能够从'CD'中只选择特定的列。

当我使用

$schema->resultset('Artist')->search({}, 
                                     {'+select' => [ 'columns I need' ],
                                      '+as' => [ 'col names' ],
                                     });

我得到"我需要的列"与主列合并,而不是一个层次结构。

      [ {
        "artist_name": "Dummy",
        "artist_id": "1",
        "cds": []
        **"cd_id": "1,
        "cd_desc": "Dummy",**
      
   
         },
        ]

如何在保持分级结构的情况下,从相关表中预取指定列?

编辑:如果我没有很清楚,我很抱歉。这里join+columns/+select的问题是它不保留分层数据结构。

'cd '应该是'Artist'对象中的一个对象数组。相反,它会在美术师级别被连接起来。我不能使用"collapse"因为我有一个旧版本的DBIx::Class。

使用join代替预取:

$schema->resultset('Artist')->search(
    {},
    {
        join         => ['cds'],
        '+select'    => ['cd.desc'],
        result_class => 'DBIx::Class::ResultClass::HashRefInflator'
    }
);

您需要DBIx::Class版本0.08250或更高版本,该版本支持collapse结果集属性:

my $rs = $schema->resultset('Artist')->search({}, {
    '+columns' => [ qw/ cds.col1 cds.col2 / ],
    join       => 'cds',
    collapse   => 1,
});