2016-07-29 3 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 attributesearch_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-> locksではDBは必要ありません。 my $ board = $ result-> expansion_boardという最初の出現時にこの設定を行う方法はありますか。また、同時にロックを取得するために、expansion_boardにロードすることもあります。 (つまり古いコードは$ result-> expansion_boardを使用しています) – melutovich

+1

@melutovich(1)私が知っている唯一のことは、 '$ board-> locks'がDBに衝突しないことです。元の '$ result'を通じた他のアクセスはキャッシュされているとは思いません。 SQLトレースを使用してDBICを実行し、生成されたステートメントを確認してください。 (2)結果クラスの 'expansion_board'メソッドをオーバーライドしようとするかもしれませんが、私はそれをお勧めしません。 – nwellnhof

関連する問題