7

使用DBIx::Class并且我有一个结果集,需要通过 SQL 无法生成的数据进行过滤。我需要做的是有效地等同于这个假设的例子:

my $resultset     = $schema->resultset('Service')->search(\%search);
my $new_resultset = $resultset->filter( sub {
    my $web_service = shift;
    return $web_service->is_available;
} );

通读文档让我不知道如何完成这样的策略。

4

2 回答 2

8

由于 DBIC 结果集的设计目标,您不能真正做到:

  • 它们编译为 SQL 并运行单个查询,它们不会早于您要求结果时执行此操作。
  • 它们是可组合的。

允许通过在 Perl 端运行的代码进行过滤会使实现这些属性变得非常麻烦,并且会隐藏这样一个事实,即这样的结果集在组合时实际上运行 N 个查询。

无论如何,你为什么想要这个?为什么简单地检索结果并自己过滤它们是不够的?

  • 封装?(例如,在您的业务逻辑层中隐藏过滤逻辑,但在显示逻辑层中启动查询。)然后编写一个自定义 ResultSet 子类,该子类具有一个运行查询并执行所需过滤的访问器。

  • 开销?(例如,您将拒绝大多数结果,因此您不希望为它们创建对象的开销。)然后使用 HashRefInflator。

于 2008-11-07T09:48:19.923 回答
0

如果您过滤结果并最终得到一个行列表,您可以创建一个新的结果集,如下所示:http ://search.cpan.org/~abraxxa/DBIx-Class-0.08127/lib/DBIx/Class/Manual/Cookbook .pod#Creating_a_result_set_from_a_set_of_rows

这可以使结果保持一致,但我想您将无法链接它或在其上使用任何其他结果集方法。

于 2011-02-28T16:03:41.077 回答