使用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; } );
阅读文档让我不知道如何完成这样的策略.
由于DBIC结果集的设计目标,您无法真正做到:
他们编译成SQL并运行单个查询,这些查询不会比您要求结果时更早.
它们是可组合的.
允许通过在Perl端运行的代码进行过滤会使得实现这些属性非常繁琐,并且会隐藏这样的结果集在编写时实际运行N个查询的事实.
无论如何,你为什么要这样?为什么简单地检索结果并自己过滤它们不够?
封装?(例如,将过滤逻辑隐藏在业务逻辑层中,但在显示逻辑层中启动查询.)然后编写一个自定义ResultSet子类,该子类具有运行查询的访问器并执行所需的过滤.
开销?(例如,您将拒绝大多数结果,因此您不需要为它们创建对象的开销.)然后使用HashRefInflator.