DBIx和Perl中的继承

Vic*_*scu 7 perl inheritance base isa dbix-class

我目前正在尝试使用DBIx实现以下方案:

产品包含"一般产品"和"捆绑产品"(捆绑产品是一般产品的集合):

package Product;
use base 'DBIx::Class::Core';
__PACKAGE__->table("products");
__PACKAGE__->add_columns(
  "productId",
  { data_type => "varchar", is_nullable => 0, size => 10},
  "name",
  { data_type => "varchar", is_nullable => 1, size => 150},
  "type",
  {
     data_type => "enum",
     default_value => "general",
     extra => {
       list => ["general", "bundle"],
     },
     is_nullable => 0,
  });
Run Code Online (Sandbox Code Playgroud)

如您所见,产品是一般产品,或捆绑产品保存在色谱柱类型中.

现在我想将这些信息封装在类标识中:我想要以下类:

  • 产品(type无所谓)
  • BundleProduct(type='bundle')
  • GeneralProduct(type='general')

我写:

package BundleProduct;
use base 'Product';

__PACKAGE__->resultset_attributes({ where => { 'type' => 'bundle' } });
1;
Run Code Online (Sandbox Code Playgroud)

package GeneralProduct;
use base 'Product';

__PACKAGE__->resultset_attributes({ where => { 'type' => 'general' } });
1;
Run Code Online (Sandbox Code Playgroud)

但在执行时

my @allProducts = $schema->resultset('BundleProduct')->all;
Run Code Online (Sandbox Code Playgroud)

所有一般产品都是取得的.虽然生成的对象是实例BundleProduct,但生成的SQL包含类的WHERE条件GeneralProduct(type='general').更糟糕的是:如果我尝试获取Product(基类BundleProductGeneralProduct),条件type='通用'也适用!似乎该定义GeneralProduct覆盖了所有其他定义.

我的设计出了什么问题?

dra*_*tun 0

它可能总是默认为常规,因为数据没有被膨胀为 Enum 对象?

令人惊讶的是它没有给出明确的错误,但也许添加以下内容(到Product包中)可以解决您的问题:

__PACKAGE__->load_components(qw/InflateColumn::Object::Enum/);
Run Code Online (Sandbox Code Playgroud)

除了上面之外,还尝试添加is_enum => 1到您的类型列定义中:

type => {
  data_type     => "enum",
  is_enum       => 1,  
  default_value => "general",
  is_nullable   => 0,
  extra => {
    list => ["general", "bundle"],
  },
},
Run Code Online (Sandbox Code Playgroud)

注意。这应该强制使用通货膨胀对象(Object::Enum),而如果没有它,我相信它会尝试使用您正在使用的 RDBMS 的本机枚举(如果存在)。

手指交叉这个作品。如果没有,请尝试删除default_value以查看其影响。