2016-07-29 5 views
0

Beispieldbix might_have und prefetch seine Beziehungen beim ersten Zugriff?

Ich habe eine Tabelle, die eine Erweiterungskarte haben könnte; eine Erweiterungskarte has_many locks

Ist es möglich, wenn der might_have zum ersten Zugriff auf die Sperren aufgerufen wird?

(Ja, ich weiß, dass, wenn ich den Tisch bekomme ich das Board Prefetch kann und es Locken;. Frage mich nur, wenn ich es auf diese Weise zu tun haben)

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. 

würde ich die meisten, wie die $ table- > expansion_board beim ersten Zugriff, um auch seine Sperren aus der Datenbank zu laden.

+1

Ich verstehe die Frage nicht. Können Sie bitte [editieren] und klarstellen, was Sie zu tun versuchen. Verwenden Sie für die Dinge, die Methoden oder Konfigurationswerte sind, das richtige Inline-Code-Markup. Es ist sehr schwer deine Frage zu lesen. – simbabque

+0

@simbabque aktualisiert; Sie können sich auch die Antwort von nwellnhof ansehen. – melutovich

Antwort

1

IIUC, haben Sie so etwas wie

my $board = $result->expansion_board; 

und wollen, dass die Schlösser des Board Prefetch. In diesem Fall könnten Sie die search_related method mit einem prefetch attribute verwenden:

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

Oder könnten Sie versuchen, die find_related method:

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

Speichert Ihr Prefetch die Karte und sperrt die Beziehungen, so dass $ result-> expansion_board und $ result-> expansion_board-> locks die Datenbank nicht mehr benötigen? Gibt es eine Möglichkeit, diese Einstellung so zu haben, dass beim ersten Auftreten von mein $ board = $ result-> expansion_board; Gleichzeitig mit dem Laden in die Erweiterungskarte sollte man auch die Sperren bekommen. (d. h. der alte Code verwendet $ result-> expansion_board) – melutovich

+1

@melutovich (1) Das einzige, was ich sicher weiß, ist, dass '$ board-> locks 'die DB nicht treffen sollte. Ich glaube nicht, dass andere Zugriffe durch das ursprüngliche '$ result' zwischengespeichert werden. Versuchen Sie, DBIC mit SQL-Ablaufverfolgung auszuführen, und sehen Sie sich die generierten Anweisungen an. (2) Vielleicht könnten Sie versuchen, die Methode 'expansion_board' in der Ergebnisklasse zu überschreiben, aber ich würde das nicht empfehlen. – nwellnhof