我目前正在努力实现与DBIx以下情形:DBIx并在Perl
表产品包含“一般产品”和“捆绑产品”(捆绑产品是普通产品的集合):
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,
});
正如你所看到的,羯羊产品是一般产品或束产品被保存在列类型。
现在我想封装在阶级认同这样的信息:我想有以下类:
- 产品(
type
无所谓) - BundleProduct(
type
=“捆绑”) - GeneralProduct(
type
= '通用')
我写道:
package BundleProduct;
use base 'Product';
__PACKAGE__->resultset_attributes({ where => { 'type' => 'bundle' } });
1;
和
package GeneralProduct;
use base 'Product';
__PACKAGE__->resultset_attributes({ where => { 'type' => 'general' } });
1;
但执行
my @allProducts = $schema->resultset('BundleProduct')->all;
当所有一般产品被取出。虽然生成的对象具有实例BundleProduct
,但生成的SQL包含类GeneralProduct
(type
='general')的WHERE条件。更糟的是:如果我尝试获取Product
(基类BundleProduct
和GeneralProduct
),则也应用条件type
='general'!看来GeneralProduct
中的定义会覆盖所有其他定义。
我的设计出了什么问题?
@dreagtun谢谢你,但我认为InflateColumn :: Object :: Enum仅用于将'varchar'字段转换为应用程序中的'enum'字段。 [链接](http://search.cpan.org/~jmmill/DBIx-Class-InflateColumn-Object-Enum-0.04/lib/DBIx/Class/InflateColumn/Object/Enum.pm) –
查看提供的测试通过'DBIx :: Class :: InflateColumn :: Object :: Enum'模块,作者总是加载组件并且设置'is_enum => 1'。以下是与您在示例中尝试使用的内容相匹配的测试:https://metacpan.org/source/JMMILLS/DBIx-Class-InflateColumn-Object-Enum-0.04/t/lib/TestDB/NativeEnumNoneNullable.pm作者也许是过于热心,但它可能值得一试。另外作者没有提供'default_value'测试,所以可能有问题呢?无论如何,我相应地更新了我的答案。 – draegtun