1

在客户端应用程序中,我有一个 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 跳过此警告(关于此的文档充其量是稀疏的)

如果有人可以帮助我,那就太棒了,谢谢

4

2 回答 2

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/
};
于 2012-06-24T12:14:59.610 回答
1

DBIx::Class使用模块中的carp()函数而DBIx::Class::Carp不是Carp. 所以@CARP_NOT$Carp::Internal不工作。改为使用$SIG{__WARN__}

于 2012-06-24T13:34:30.930 回答