DBIx :: Class - 这个关系被缓存在哪里?

时间:2011-11-01 22:14:14

标签: perl dbix-class

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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