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无所谓)type='bundle')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(基类BundleProduct和GeneralProduct),条件type='通用'也适用!似乎该定义GeneralProduct覆盖了所有其他定义.
我的设计出了什么问题?
它可能总是默认为常规,因为数据没有被膨胀为 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以查看其影响。