使用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;
} );
阅读文档并不能让我知道如何完成这样的策略。
答案 0 :(得分:8)
由于设计了DBIC结果集的目标,您无法真正做到:
允许在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。
这可以保持结果一致,将结果保留为结果集,但我想你将无法链接它或使用任何其他结果集方法。