perl DBIx::Class 对 table 上的所有搜索有一个默认过滤器
perl DBIx::Class have a default filter for all searches on a table
我有一堆 DBIx::Class 结果 类 通过 dbicdump / DBIx::Class::Schema::Loader
从我的数据库模式创建
我需要向 table 之一添加一个 is_deleted
布尔列,并过滤掉 所有 现有搜索中的已删除记录和加入。
不幸的是,在庞大的 perl 应用程序中有 30 或 40 个地方直接使用有问题的 table,并且至少有相同数量的地方通过 prefetch
或 join
属性为 search()
。手动更改它们是可能的,但非常耗时。
有没有办法为所有 SELECT
来自或 JOIN
特定 table 的查询添加默认 WHERE
子句?
我正在寻找能够调用 resultset('MyTable')->search({},{})
并将 WHERE is_deleted = 0
添加到所有查询的方法。
另外在使用 prefetch => [qw(my_table)],
时应用相同的 is_deleted = 0
过滤器。
是的,您可以子class 您的结果集 class 并覆盖 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
设置为 1 的行。
- DBIx::Class 使用 Class::C3 进行方法解析,所以我们使用
next::method()
而不是 SUPER::method()
来调用 superclass 方法。
- 任何搜索选项都会原封不动地传递给 superclass 方法。
我会创建一个虚拟视图,并在 table 之外添加一个关系到视图。
我有一堆 DBIx::Class 结果 类 通过 dbicdump / DBIx::Class::Schema::Loader
从我的数据库模式创建我需要向 table 之一添加一个 is_deleted
布尔列,并过滤掉 所有 现有搜索中的已删除记录和加入。
不幸的是,在庞大的 perl 应用程序中有 30 或 40 个地方直接使用有问题的 table,并且至少有相同数量的地方通过 prefetch
或 join
属性为 search()
。手动更改它们是可能的,但非常耗时。
有没有办法为所有 SELECT
来自或 JOIN
特定 table 的查询添加默认 WHERE
子句?
我正在寻找能够调用 resultset('MyTable')->search({},{})
并将 WHERE is_deleted = 0
添加到所有查询的方法。
另外在使用 prefetch => [qw(my_table)],
时应用相同的 is_deleted = 0
过滤器。
是的,您可以子class 您的结果集 class 并覆盖 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
设置为 1 的行。 - DBIx::Class 使用 Class::C3 进行方法解析,所以我们使用
next::method()
而不是SUPER::method()
来调用 superclass 方法。 - 任何搜索选项都会原封不动地传递给 superclass 方法。
我会创建一个虚拟视图,并在 table 之外添加一个关系到视图。