簡體   English   中英

perl DBIx :: Class具有對表上所有搜索的默認過濾器

[英]perl DBIx::Class have a default filter for all searches on a table

我有一堆DBIx :: Class結果類,由dbicdump / DBIx :: Class :: Schema :: Loader從我的數據庫模式創建

我需要將is_deleted布爾列添加到其中一個表中,並在所有現有搜索和JOIN中過濾掉已刪除的記錄。

不幸的是,在龐大的perl應用程序中有30或40個位置直接使用有問題的表,並且至少有與通過prefetchjoin屬性到search()聯接到該表的位置相同的位置。 可以手動更改它們,但非常耗時。

有沒有一種方法可以向所有SELECT from或JOIN到特定表的查詢添加默認的WHERE子句?

我正在尋找一種方法來調用resultset('MyTable')->search({},{})並將WHERE is_deleted = 0添加到所有查詢中。 另外,使用prefetch => [qw(my_table)],將應用相同的is_deleted = 0過濾器。

是的,您可以對結果集類進行子類化,並覆蓋search()方法以添加搜索條件。

package MyApp::Schema::Resultset::MyTable;

use strict;
use warnings;

use base 'DBIx::Class::Resultset';

sub search {
  my $self = shift;

  my ($cols, $opts) = @_;

  $cols //= {};

  $cols->{is_deleted} //= 0;

  return $self->next::method($cols, $opts);
}

1;

注意:

  1. 我們僅將is_deleted設置is_deleted尚未設置的狀態-如果需要的話,這允許我們查找將is_deleted設置為1的行。
  2. DBIx :: Class使用Class :: C3進行方法解析,因此我們使用next::method()而不是SUPER::method()來調用超類方法。
  3. 任何搜索選項都將原樣傳遞給超類方法。

我將創建一個虛擬視圖,並在表之外向該視圖添加關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM