我有一堆由dbicdump / DBIx::Class::Schema::Loader从我的数据库模式创建的 DBIx::Class Result 类
我需要向is_deleted其中一个表添加一个布尔列,并过滤掉所有现有搜索和联接中已删除的记录。
不幸的是,在庞大的 perl 应用程序中有 30 或 40 个直接使用相关表的地方,并且至少有相同数量的通过prefetch或join属性加入它的地方search()。手动更改它们是可能的,但非常耗时。
有没有办法向来自或来自特定表的WHERE所有查询添加默认子句?SELECTJOIN
我正在通过某种方式能够调用resultset('MyTable')->search({},{})并WHERE is_deleted = 0添加到所有查询中。加上is_deleted = 0使用时应用相同的过滤器prefetch => [qw(my_table)],。
是的,您可以子类化您的结果集类并覆盖该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;
Run Code Online (Sandbox Code Playgroud)
笔记:
is_deleted在尚未设置的情况下进行设置 - 这允许我们在需要时查找is_deleted设置为 1 的行。next::method()而不是SUPER::method()调用超类方法。