[英]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個位置直接使用有問題的表,並且至少有與通過prefetch
或join
屬性到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;
注意:
is_deleted
設置is_deleted
尚未設置的狀態-如果需要的話,這允許我們查找將is_deleted
設置為1的行。 next::method()
而不是SUPER::method()
來調用超類方法。 我將創建一個虛擬視圖,並在表之外向該視圖添加關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.