[Cologne-pm] Catalyst, TT and DBIx::Class

A. Pagaltzis pagaltzis at gmx.de
Wed May 9 07:14:27 PDT 2007


Hi quarky,

* quarky at quantentunnel.de <quarky at quantentunnel.de> [2007-05-09 14:35]:
> In TT steht dann um auf die einzelnen Zeilen des ResultSets
> zuzugreifen:
> 
> [% FOREACH book IN books -%]
>    [% book.title %]
> [% END %]
> 
> Wenn ich aber in TT sage:
> 
> [% USE Dumper(Indent=1) -%]
> [% Dumper.dump(books) %]
> 
> dann bekomme ich irgendein Array of Objects ( meiner Meinung
> nach ein Array of ResultSet ).

Wenn ich DBIC richtig verstehe, ist dass ein Array von `::Row`-
Instanzen, nicht ein Array von `::ResultSet`-Instanzen. Die
bekämst du, wenn du es so schriebst:

    $c->stash->{books} = $c->model('MyAppDB::Book')->all;

Dann wäre `books` selber ein `::ResultSet`, du könntest aber dann
nicht mehr mit einer FOREACH-Schleife drüber iterieren sondern
müsstest WHILE nehmen. (Da kriegst du aber den schönen Iterator
nicht, mit dem du Dinge wie `loop.last` oder `loop.odd` abfragen
kannst.)

> Jedenfalls nichts was sich in TT meiner Ansicht nach mittels
> foreach Schleife und Hash-Keys erschließen ließe.

Das heisst nicht, dass das Beispiel falsch ist. TT verbirgt den
Unterschied zwischen Hashes und Objekten. `book.title` kann
sowohl `$book->{title}` als auch `$book->title()` bedeuten.

> Ich suche nämlich nach einer Möglichkeit ein beliebiges
> ResultSet in Tabellenform anzuzeigen und brauche dazu die
> Spaltennamen. Ich dachte ich könnte mir einfach über
> users.first.keys.sorted die Spaltennamen erschleichen und dann
> damit die Tabellenspalten benennen und später auf die Felder
> zugreifen.

Du kriegst mit `::Row::get_columns` die Zeile als Hash (keine
Referenz), oder mit `::ResultSource::columns` eine Liste von
Spaltennamen. An die passende `::ResultSource` kommst du mit
`::ResultSet::result_source` bzw `::Row::result_source` ran.

Gruss,
-- 
Aristoteles Pagaltzis // <http://plasmasturm.org/>


More information about the Cologne-pm mailing list