DBIx :: Class - где эти отношения кэшируются? - PullRequest
2 голосов
/ 02 ноября 2011

У меня есть сущность 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 ]

1 голос
/ 02 ноября 2011

Я думаю, что если у вас есть заказ с адресом, у вас будет только один адрес для заказа:

__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

0 голосов
/ 03 ноября 2011

Нашел ответ: он кешируется в $order->{_relationship_data}->{address}.

Не определено, можно ли отключить это кэширование.

...