如何使用外部数据过滤DBIX :: Class结果集?

时间:2008-11-07 09:02:44

标签: perl dbix-class

使用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;
} );

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

2 个答案:

答案 0 :(得分:8)

由于设计了DBIC结果集的目标,您无法真正做到:

  • 他们编译成SQL并运行一个查询,这个查询不会比你要求结果时更早。
  • 它们是可以组合的。

允许在Perl端运行的代码进行过滤会使得实现这些属性非常繁琐,并且会隐藏这样的结果集在编写时实际运行N个查询的事实。

你为什么要这样呢?为什么只是简单地检索结果并自己过滤它们?

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

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

答案 1 :(得分: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

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