【问题标题】:perl DBIx::Class have a default filter for all searches on a tableperl DBIx::Class 对表上的所有搜索都有一个默认过滤器
【发布时间】:2019-12-06 14:18:22
【问题描述】:

我有一堆由dbicdump / DBIx::Class::Schema::Loader从我的数据库架构创建的 DBIx::Class 结果类

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

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

有没有办法将默认的WHERE 子句添加到SELECT 来自或JOIN 到特定表的所有查询?

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

【问题讨论】:

    标签: perl dbix-class


    【解决方案1】:

    是的,您可以继承您的结果集类并覆盖 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() 来调用超类方法。
    3. 任何搜索选项都将不加改变地传递给超类方法。

    【讨论】:

    • 这非常适合直接搜索有问题的表,干杯@dave!我会看看我是否可以找到一种方法来在另一个结果集也加入表时应用过滤器。
    • 您可以在关系上定义 where 子句并有两个 rel,一个带过滤器,一个不带。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 2016-08-25
      • 2016-04-08
      相关资源
      最近更新 更多