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,并且至少有相同数量的地方通过 prefetchjoin 属性为 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;

注:

  1. 我们只在 is_deleted 尚未设置时设置它 - 这允许我们在需要时查找 is_deleted 设置为 1 的行。
  2. DBIx::Class 使用 Class::C3 进行方法解析,所以我们使用 next::method() 而不是 SUPER::method() 来调用 superclass 方法。
  3. 任何搜索选项都会原封不动地传递给 superclass 方法。

我会创建一个虚拟视图,并在 table 之外添加一个关系到视图。