2008-11-07 71 views
5

使用DBIx::Class,我有一個結果集需要過濾不能由SQL生成的數據。我需要做的是什麼實際上等同於這個假設的例子:如何使用外部數據過濾DBIX :: Class結果集?

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

通過文檔閱讀讓我不知道如何來實現這樣的戰略。

回答

8

你真的不能,由於對其中DBIC結果集的設計目標:

  • 他們蒐集到SQL和運行的單個查詢,他們沒有這樣做,當你問的結果比前面, 。
  • 它們是可組合的。

允許通過在Perl端運行的代碼進行過濾會使得它非常容易實現這些屬性,並會隱藏這樣的事實,即這些結果集實際上在編寫時運行N個查詢。

爲什麼你想要這個,無論如何?爲什麼簡單地檢索結果並自己過濾不足?

  • 封裝? (例如,在業務邏輯層中隱藏篩選邏輯,但在顯示邏輯層中啓動查詢)。然後編寫一個定製的ResultSet子類,該子類具有運行查詢的訪問者並執行所需的篩選。

  • 開銷? (例如,你將拒絕大多數結果,所以你不需要爲它們創建對象的開銷。)然後使用HashRefInflator。

+0

我們有使用結果集的代碼。如果我們手動過濾結果,那麼期望結果集的代碼必須從根本上改變。這個提議的「過濾器」解決方案是我們團隊尋找替代品的許多工作的結果,但其原因太多而無法在這裏回答。 – Ovid 2008-11-07 10:07:11