Perl 如何就地修改DBIx::Class::行?

Perl 如何就地修改DBIx::Class::行?,perl,dbix-class,Perl,Dbix Class,使用DBIx::Class::ResultSet是否可以像下面尝试的那样对内存中的结果进行更改 my @results = $self->search(...); for my $result (@results) { my $row = {$result->get_columns}; $row->{fieldname} = 'something else'; } return @results; 您可以使用类似以下内容: my @rows = $self->

使用DBIx::Class::ResultSet是否可以像下面尝试的那样对内存中的结果进行更改

my @results = $self->search(...);

for my $result (@results) {
  my $row = {$result->get_columns};
  $row->{fieldname} = 'something else';
}

return @results;

您可以使用类似以下内容:

my @rows = $self->search(
    {...},
    {result_class => 'DBIx::Class::ResultClass::HashRefInflator'}
);

for my $row (@rows) {
    $row->{fieldname} = 'something else';
}

return @rows;

DBIx::Class为您定义的每一列生成一个列访问器。 它既可以用作读取器,也可以用作读取器

my $value = $row->columnname;
作为一名作家

$row->columnname('new value');

请不要损坏DBIx::Class::Row对象的内部变量!请注意,这是一个一般性建议,不特定于DBIx::Class、Perl或允许您执行此操作的任何其他语言。@abraxxa在
search
中使用
DBIx::Class::ResultClass::HashRefInflator
返回哈希引用,不是对象。使用它意味着您无法取回行对象,因此无法使用它更新数据库。@abraxxa此条件不在问题范围内。如果
fieldname
不是列名,该怎么办?在定义列时,您可以指定一个与列名不同的访问器名称,但我不建议使用它,因为它会造成问题更难,因为例如在搜索中,您只能使用列名,而不能使用访问器名。如果
fieldname
不是列名,也不是访问器名,那么应该使用get\u column方法。