2016-07-29 41 views
0

示例dbix might_have并在第一次访问时预取它的关系?

我有一张桌子,可能有扩展板;一个扩展板has_many锁

是否有可能何时第一次访问might_have来预取锁?

(是的,我知道,当我得到的表,我可以预取板,它的锁。只是想知道如果我不得不做这种方式)

package Table; 

__PACKAGE__->might_have("expansion_board", "ExpansionBoard", 
{ "foreign.boardid" => "self.boardid" }); 

#etc. 

package ExpansionBoard; 

__PACKAGE__->has_many("locks","Lock", 
{ "foreign.boardid" => "self.boardid" }, 
undef); 

#etc. 

package Lock; 

#etc. 

我最想的是$表 - >首次访问时的expansion_board也会从数据库加载它的锁。

+1

我不明白的问题。你能否请[编辑]并澄清你想要做的事情。请为方法或配置值使用适当的内联代码标记。阅读您的问题非常困难。 – simbabque

+0

@simbabque更新;你也可以看看nwellnhof的答案。 – melutovich

回答

1

IIUC,你有什么样

my $board = $result->expansion_board; 

,并希望预取板的锁。在这种情况下,你可以用prefetch attribute使用search_related method

my $board = $result->search_related('expansion_board', undef, { 
    prefetch => 'locks', 
})->single; 

或者你可以尝试find_related method

my $board = $result->find_related('expansion_board', undef, { 
    prefetch => 'locks', 
}); 
+0

您的预取缓存板和锁关系,以便$ result-> expansion_board和$ result-> expansion_board->锁不再需要DB吗? 有没有办法让这个设置,以便第一次出现 my $ board = $ result-> expand_board;会在装载expand_board的同时获取锁。 (即旧代码使用$ result-> expansion_board) – melutovich

+1

@melutovich(1)我唯一知道的是'$ board-> locks'不应该碰到数据库。我不认为通过原始'$ result'的其他访问被缓存。尝试使用SQL跟踪运行DBIC并查看它生成的语句。 (2)也许你可以尝试覆盖结果类中的'expand_board'方法,但我不会推荐这种方法。 – nwellnhof