DBIC-在保持has_many关系的同时选择“预取”中的特定列

时间:2014-03-10 08:43:30

标签: perl dbix-class

我有两张桌子上有'艺术家'has_many'CD'。

我想获取'artist'和'CDs'并使用HashRefInflator来获取类似的东西(JSON格式) 我使用'HashRefInflator'。

     [ {

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

1。当我使用
    $ schema->结果集( '艺术家') - >搜索({},                                            {                                              prefetch => 'CDS',                                            }); 我从CD表中获得了“EXTRA”列的结果。我希望能够只选择“CD”中的特定列。

  1. 当我使用

    $ schema->结果集( '艺术家') - >搜索({},                                      {'+ select'=> ['我需要的栏'',                                       '+ as'=> ['col names'],                                      });

    我得到'我需要的列'与主列而不是层次结构合并。

      [ {
        "artist_name": "Dummy",
        "artist_id": "1",
        "cds": []
        **"cd_id": "1,
        "cd_desc": "Dummy",**
    
    
         },
        ]
    
  2. 如何在保持层次结构的同时从相关表中预取特定列。 ?

    编辑:如果我不是很清楚,我很抱歉。 'join'和'+ columns'/'+ select'的问题在于它不保留分层数据结构。 'cds'应该是'Artist'对象中的一组对象。而不是它在Artist级别加入。 我不能使用“崩溃”,因为我有一个旧版本的DBIx :: Class。我会尝试安装更高版本并检查。

2 个答案:

答案 0 :(得分:1)

使用join而不是prefetch:

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

答案 1 :(得分:0)

您需要DBIx::Class版本0.08250或更高版本支持collapse result set attribute

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