Perl如何使用DBIx :: Class精美地返回数据

问题描述

我是DBIx :: Class的新手。我将其用于API以从我的数据库重新调出数据,我想与DBIC重新创建SELECT * FROM表。使用DBI,对我来说效果很好。
返回“美丽”数据的最佳方法是什么?
我想以散列数组形式返回数据:

[
  {
    id => 123,name => 'name',....
  }
]

但使用my @rs = $schema->resultset('Product')->all; return \@rs;。我没有得到我想要的输出。 使用Data :: Dumper检查对象时,我得到以下信息:

$VAR1 = bless( {
              '_column_data' => {
                                  'name' => 'test','id' => 123'
                                },'_result_source' => $VAR1->{'_result_source'},'_in_storage' => 1
            },'DB::Schema::Result::Product' );

我确定我误解了DBIC的概念。
我如何仅获取所有列的数据?谢谢大家的帮助!

解决方法

Data :: Dumper只是溢出数据结构的胆量。这就是DB :: Schema :: Result :: Product对象的精髓,它代表Product表的单行。

如果要从对象输出漂亮的图像,则需要向对象询问。您可以在它们上调用DBIx::Class::Row方法。如果只需要对象中的行数据,请使用get_columnsget_inflated_columns。它们返回哈希值,因此您需要参考。

my @rows = map { my %h = $_->get_columns; \%h } @rs;
,

我认为最简单的方法是get_inflated_columns方法。

map {{$_->get_inflated_columns}} $rs->all

考虑使用Data::Dump,如果您真的想要漂亮的东西,请Data::Printer

,
my @rs = map {$_->_column_data} $schema->resultset('Product')->all

?就是说,按照惯例,下划线前导的字段是“私有”字段,可能没有文档记录或文档不足,或者在将来的实现中可能会更改,恕不另行通知,因此您应提防直接访问它们。

由于DBIx::Class的意义是将数据库行转换为对象,因此应将结果集视为对象数组。要将其转换为适用于Data::Dumper的哈希,您可以执行类似

的操作
my @rs = map { { name => $_->name,id => $_->id } } $schema->resultset('Product')->all