2016-07-29 24 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

相關問題