perl DBIx::Class 对表上的所有搜索都有一个默认过滤器

d5v*_*5ve 1 perl dbix-class

我有一堆由dbicdump / DBIx::Class::Schema::Loader从我的数据库模式创建的 DBIx::Class Result 类

我需要向is_deleted其中一个表添加一个布尔列,并过滤掉所有现有搜索和联接中已删除的记录。

不幸的是,在庞大的 perl 应用程序中有 30 或 40 个直接使用相关表的地方,并且至少有相同数量的通过prefetchjoin属性加入它的地方search()。手动更改它们是可能的,但非常耗时。

有没有办法向来自或来自特定表的WHERE所有查询添加默认子句?SELECTJOIN

我正在通过某种方式能够调用resultset('MyTable')->search({},{})WHERE is_deleted = 0添加到所有查询中。加上is_deleted = 0使用时应用相同的过滤器prefetch => [qw(my_table)],

Dav*_*oss 5

是的,您可以子类化您的结果集类并覆盖该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)

笔记:

  1. 我们只is_deleted在尚未设置的情况下进行设置 - 这允许我们在需要时查找is_deleted设置为 1 的行。
  2. DBIx::Class 使用Class::C3进行方法解析,因此我们使用next::method()而不是SUPER::method()调用超类方法。
  3. 任何搜索选项都不变地传递给超类方法。