我目前正在尝试使用 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,
});
如您所见,该产品是通用产品还是捆绑产品保存在列type中。
现在我想将此信息封装在类标识中:我想要以下类:
- 产品(
type
无所谓) - 捆绑产品(
type
='捆绑') - 一般产品(
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;
获取所有通用产品。虽然生成的对象是 instance BundleProduct
,但生成的 SQL 包含类的 WHERE 条件GeneralProduct
(type
='general')。更糟糕的是:如果我尝试获取( and的Product
基类)条件= 'general' 也适用!似乎其中的定义覆盖了所有其他定义。BundleProduct
GeneralProduct
type
GeneralProduct
我的设计有什么问题?