Thread [DBIx::Class] prefetch, ->next() auf related tables (6 answers)
Opened by Britzel at 2013-11-04 16:20

Britzel
 2013-11-04 16:20
#171752 #171752
User since
2012-10-02
20 Artikel
BenutzerIn
[default_avatar]
Moin.

Es existiert eine Haupttabelle 'Artikel', dazu eine 1:n table 'art2att', die Relation heisst 'art2atts'.

Mit DBIx::Class hole ich mir ein ResultSet aus der Table 'artikel':

Code: (dl )
1
2
3
4
5
6
7
8
9
10
my $rs = $schema->resultset('Artikel')->search(
{
'art2atts.id_at' => $aid,
def_attgroup => { IN => \@gids }
},
{
select => ['artnum', 'artname', 'text', ],
prefetch => ['art2atts'],
order_by => 'artnum',
});


So weit, so gut, funktioniert.

Nun will ich auf das Resultset zugreifen. Das Problem besteht beim dereferenzieren eines Feldes der related table 'art2atts'.

Man beachte: '$row->art2atts' ist ein Objekt vom Typ 'DBIx::Class::ResultSet'.

Wenn ich das so mache:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
while ( my $row = $rs->next ) {
# Welchen Artikel haben wir denn hier?
say "Artikel: ",$row->artnum," Name: ",$row->artname;

# Welche Attribute hat dieser Artikel?

while ( my $inner_row = $row->art2atts->next() ) {
say "Attribut-Id: ",$inner_row->id;
}
}


dann wird der erste Artikel endlos oft ausgegeben, d.h. $row->art2atts->next() iteriert nicht.

Wenn ich hingegegen dieses innere ResulSet zunächst einer Variablen zuweise (siehe Zeile 6):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
while ( my $row = $rs->next ) {
# Welchen Artikel haben wir denn hier?
say "Artikel: ",$row->artnum," Name: ",$row->artname;

# Welche Attribute hat dieser Artikel?
my $irs = $row->art2atts;
while ( my $inner_row = $irs->next() ) {
say "Attribut-Id: ",$inner_row->id;
}
}

dann geht das problemlos und wie gewünscht.

Kann mich jemand erleuchten wo ich hier die Tomaten auf den Augen habe?

Danke.

Britzel

View full thread [DBIx::Class] prefetch, ->next() auf related tables