DBIx::Class中recursive_update调用失败,请求排查错误原因
问题:DBIx::Class调用recursive_update方法失败
我刚开始使用DBIx::Class,对其有初步了解但觉得它较为复杂。想要调用recursive_update方法却始终无法成功。根据文档说明,我在DBIx::Class::Schema::Loader生成的My/Schema.pm中添加了以下代码:
__PACKAGE__->load_namespaces(default_resultset_class => '+DBIx::Class::ResultSet::RecursiveUpdate');
当我尝试通过关联的ResultSet更新数据时,使用了如下代码:
my $result = $schema->resultset('Table')->find($id}); $result->recursive_update({ 'rel_table' => [...], });
但出现了错误:
Can't locate object method "recursive_update" via package My::Schema::Result::Table"
问题原因与解决方法
recursive_update是ResultSet类的方法,不是Result对象的方法。你当前是在find返回的Result实例(My::Schema::Result::Table对象)上调用它,所以会出现方法找不到的错误。- 正确的调用方式是直接在ResultSet对象上执行
recursive_update,传入包含目标记录标识(比如主键)和关联数据的参数。
正确示例代码
# 直接通过ResultSet针对指定ID的记录递归更新 $schema->resultset('Table')->recursive_update({ id => $id, 'rel_table' => [...] }); # 如果已经持有Result对象,也可以通过它获取对应的ResultSet再调用 $result->result_source->resultset->recursive_update({ id => $result->id, 'rel_table' => [...] });
另外请确认DBIx::Class::ResultSet::RecursiveUpdate已经正确安装到你的Perl环境中,你在Schema中设置默认ResultSet类的代码是正确的。
内容的提问来源于stack exchange,提问作者Struppi
相关产品推荐
相关产品推荐

