2 votes

Perl Comment utiliser DBIx::Class pour retourner de belles données

Je suis nouveau dans DBIx::Class. Je l'utilise pour une API afin de récupérer des données de ma base de données et je veux recréer un SELECT * FROM table avec DBIC. Avec DBI, cela a bien fonctionné pour moi.
Quelle est la meilleure approche pour rendre les données "belles" ?
Je veux retourner les données dans un tableau de hashs comme :

[
  {
    id => 123,
    name => 'name',
    ....
  }
]

Mais avec my @rs = $schema->resultset('Product')->all; return \@rs; . Je n'obtiens pas la sortie que je veux. En inspectant les objets avec Data::Dumper, j'obtiens ce qui suit :

$VAR1 = bless( {
              '_column_data' => {
                                  'name' => 'test',
                                  'id' => 123'
                                },
              '_result_source' => $VAR1->{'_result_source'},
              '_in_storage' => 1
            }, 'DB::Schema::Result::Product' );

Je suis sûr d'avoir mal compris le concept de DBIC.
Comment puis-je obtenir les données de toutes les colonnes seulement ? Merci à tous pour votre aide !

6voto

Schwern Points 33677

Data::Dumper ne fait que déverser les entrailles d'une structure de données. Il s'agit des entrailles d'un objet DB::Schema::Result::Product qui représente une seule ligne de la table Product.

Si vous voulez une jolie sortie d'un objet, vous devez la demander à l'objet. Vous pouvez appeler DBIx::Class::Row sur eux. Si vous voulez juste les données de la ligne de l'objet, utilisez get_columns ou get_inflated_columns . Ils retournent un hash, donc vous devez prendre une référence.

my @rows = map { my %h = $_->get_columns; \%h } @rs;

5voto

Le moyen le plus simple auquel je pense est la méthode get_inflated_columns.

map {{$_->get_inflated_columns}} $rs->all

Envisagez d'utiliser Data::Dump et si vous voulez vraiment quelque chose de beau, Data::Printer .

4voto

mob Points 61524
my @rs = map {$_->_column_data} $schema->resultset('Product')->all

? Cela dit, par convention, un champ comportant un trait de soulignement en tête est un champ "privé", susceptible d'être non documenté ou sous-documenté, ou de faire l'objet de modifications dans de futures implémentations sans préavis, et vous devriez vous méfier d'y accéder directement.

Puisque le point de DBIx::Class est de traduire les lignes de la base de données en objets, vous devez traiter votre ensemble de résultats comme un tableau d'objets. Pour le convertir en un hachage utilisable avec la commande Data::Dumper vous pourriez faire quelque chose comme

my @rs = map { { name => $_->name, id => $_->id } } $schema->resultset('Product')->all

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X