2

我有一个 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 配置为缓存这些关系)吗?

4

2 回答 2

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

于 2011-11-02T01:00:55.530 回答
0

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

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

于 2011-11-03T16:22:15.917 回答