【问题标题】:DBIx::Class - where is this relationship being cached?DBIx::Class - 这个关系在哪里被缓存?
【发布时间】:2011-12-24 05:06:12
【问题描述】:

我有一个 Order 实体和一个 Address 实体,在我的 Schema::Result::Order 模块中我有一个简单的属于关系:

__PACKAGE__->belongs_to( "address", 'Schema::Result::Address', 
                                             { addressid => 'addressid' });

我用DBIC_TRACE=1运行这段代码:

my $order = $schema->resulset('Order')->find($id);
my $add1 = $order->address;
my $add2 = $order->address;

我只看到一个SELECT ... FROM ADDRESS ... 查询,所以显然第二个$order->address 方法没有访问数据库。

所以这可能是一个简单的问题,但是地址对象在哪里被缓存? (在$order 对象中?)

其次,这种缓存是否可配置(即我可以将 DBIC 配置为缓存这些关系)吗?

【问题讨论】:

    标签: perl dbix-class


    【解决方案1】:

    我认为您的订单与地址关系的方式将只有一个订单地址:

    __PACKAGE__->belongs_to( "address", 'Schema::Result::Address', 
                                                { addressid => 'addressid' });
    

    如果您的订单有很多您想要的地址:

    __PACKAGE__->has_many( "address", 'Schema::Result::Address', 
                                                { addressid => 'addressid' });
    

    然后您可以通过多种方式检索地址:

    my $address_rs = $order->search_related('address',{});
    while(my $row = $address_rs->next) {
    #$row has an address record
    }
    

    我不确定在这种情况下缓存是如何工作的

    my $order = $schema->resulset('Order')->find($id);
    my $add1 = $order->address;
    my $add2 = $order->address;
    

    但是如果你像这样访问你的地址记录:

    my $address_rs = $order->search_related('address',{});
    

    你可以用你的查询属性来控制它:

    https://metacpan.org/module/DBIx::Class::ResultSet#cache

    【讨论】:

      【解决方案2】:

      找到答案:缓存在$order->{_relationship_data}->{address}

      尚未确定是否可以禁用该缓存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-29
        • 2016-08-09
        • 1970-01-01
        • 1970-01-01
        • 2011-07-09
        相关资源
        最近更新 更多