在DBIx :: Class :: ResultSource预取中防止Carp :: carp消息

时间:2012-06-24 12:02:51

标签: database perl dbix-class

在客户端应用程序中,我有一个DBIx :: Class模型'Todo',它可以使用多对多关系链接到许多其他模型。 我知道,由于业务逻辑,只有1个外国模型与之相关联。我想在我的查询中使用以下方法获取该模型:

my $objects = $c->model('DB')->resultset('Todo')->search($myFilter,{
    prefetch => \@relations # contains all possible relations
});

与文档状态DBIx :: Class :: ResultSource一样警告:

DBIx::Class::ResultSet::next(): Prefetching multiple has_many rels accountbalances_todos and accounts_todos at top level will explode the number of row objects retrievable via ->next or ->all. Use at your own risk. at /media/psf/projects/.../Controller/Todo.pm line 117

有人能告诉我如何在不诉诸编辑DBIx :: Class :: ResultSource本身的情况下防止此错误吗?我没有看到其他方式做我想做的事情,并希望阻止应用程序在日志中转储大量警告。我试过摆弄@CARP_NOT和$ Carp :: Internal,但是不能让Carp跳过这个警告(关于这个的文档最多是稀疏的)

如果有人能帮助我,那将是非常棒的,谢谢

2 个答案:

答案 0 :(得分:2)

您可以覆盖警告信号的默认处理以捕获并忽略此特定警告:

$SIG{__WARN__} = sub {
  my $warn_msg = $_[0];
  if ( $warn_msg =~ m/Prefetching multiple has_many rels accountbalances_todos/ ) {
    # do nothing
  } else {
    warn $warn_msg;
  }
};

或者,如果您愿意,

$SIG{__WARN__} = sub {
  warn $_[0] unless $_[0] =~ m/Prefetching multiple has_many rels accountbalances_todos/
};

答案 1 :(得分:1)

DBIx::Class使用carp()模块中的DBIx::Class::Carp函数而不是Carp。因此@CARP_NOT$Carp::Internal无效。而是Use $SIG{__WARN__}