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 に答える