gpt4 book ai didi

perl - Perl 中的 DBIx 和继承

转载 作者:行者123 更新时间:2023-12-04 12:34:43 24 4
gpt4 key购买 nike

我目前正在尝试使用 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 = '捆绑')
  • GeneralProduct ( type = 'general')

  • 我写:
    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 的 WHERE 条件( type = '一般')。更糟糕的是:如果我尝试获取 Product ( BundleProductGeneralProduct 的基类)条件 type = 'general' 也适用!看来 GeneralProduct里面的定义覆盖所有其他定义。

    我的设计有什么问题?

    最佳答案

    resultset_attributes的用法不推荐。您应该为 Product 实现一个结果集类与方法 bundle_productsgeneral_products :

    package My::Schema::ResultSet::Product;
    use base 'DBIx::Class::ResultSet';

    sub bundle_products { shift->search({ type => 'bundle' }); }
    sub general_products { shift->search({ type => 'general' }); }

    然后您可以像这样搜索特定产品:
    $schema->resultset('Product')->bundle_products->all;
    $schema->resultset('Product')->general_products->all;

    documentation of resultset_attributes .

    也看看 DBIx::Class::DynamicSubclass .它在子类化结果时添加了一些有用的功能。

    关于perl - Perl 中的 DBIx 和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12844633/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com