我有两个'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,
});