【问题标题】:How can you modify a DBIx::Class::Row in place?如何修改 DBIx::Class::Row?
【发布时间】:2016-05-01 00:25:43
【问题描述】:

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

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

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

return @results;

【问题讨论】:

    标签: perl dbix-class


    【解决方案1】:

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

    my $value = $row->columnname;
    

    作为作家

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

    【讨论】:

    • 如果fieldname 不是列名怎么办?
    • 在定义列时,您可以指定与列名不同的访问器名称,但我不推荐它,因为它会使事情变得更难,因为例如在搜索中您只能使用列名,而不是访问者名称。这会让以后阅读代码的人感到困惑。
    • 如果fieldname 既不是列名也不是访问者名怎么办?
    • 那么你应该使用get_column方法。
    【解决方案2】:

    你可以这样使用:

    my @rows = $self->search(
        {...},
        {result_class => 'DBIx::Class::ResultClass::HashRefInflator'}
    );
    
    for my $row (@rows) {
        $row->{fieldname} = 'something else';
    }
    
    return @rows;
    

    【讨论】:

    • 请不要破坏 DBIx::Class::Row 对象的内部变量!请注意,这是一个一般性建议,并非针对 DBIx::Class、Perl 或任何其他允许您执行此操作的语言。
    • @abraxxa 在search 中使用DBIx::Class::ResultClass::HashRefInflator 返回哈希引用,而不是对象。
    • 使用它意味着您不会取回行对象,因此无法使用它更新数据库。
    • @abraxxa 这个条件不是问题。
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2013-03-08
    • 2011-07-09
    相关资源
    最近更新 更多