Commit | Line | Data |
8d028daa |
1 | package DBIx::Class::ResultSet::HashRef; |
2 | |
3 | use warnings; |
4 | use strict; |
698b98d0 |
5 | use Carp; |
8d028daa |
6 | use base qw( DBIx::Class::ResultSet ); |
7 | use DBIx::Class::ResultClass::HashRefInflator; |
8 | |
200650cd |
9 | our $VERSION = '1.001'; |
8d028daa |
10 | |
11 | =head1 NAME |
12 | |
200650cd |
13 | DBIx::Class::ResultSet::HashRef - Adds syntactic sugar to skip the fancy objects |
8d028daa |
14 | |
15 | =head1 SYNOPSIS |
16 | |
17 | # in your resultsource class |
18 | __PACKAGE__->resultset_class( 'DBIx::Class::ResultSet::HashRef' ); |
19 | |
20 | # in your calling code |
21 | my $rs = $schema->resultset('User')->search( { } )->hashref_rs; |
22 | while (my $row = $rs->next) { |
23 | print Dumper $row; |
24 | } |
25 | |
26 | You can chain up every L<DBIx::Class::ResultSet> method to ->hashref_rs: |
27 | |
28 | * ->hashref_rs->all (same as ->hashref_array) |
29 | |
30 | * ->hashref_rs->first (same as ->hashref_first) |
31 | |
32 | =head1 DESCRIPTION |
33 | |
34 | This is a simple way to allow you to set result_class to L<DBIx::Class::ResultClass::HashRefInflator> to |
35 | skip the fancy objects. |
36 | |
37 | =head1 INSTALLATION |
38 | |
39 | perl Makefile.PL |
40 | make |
41 | make test |
42 | make install |
43 | |
44 | =head1 METHODS |
45 | |
46 | =head2 hashref_rs( ) |
47 | |
48 | Sets result_class to L<DBIx::Class::ResultClass::HashRefInflator> and returns the resultset. |
49 | |
50 | =cut |
51 | |
52 | sub hashref_rs { |
53 | my ($self) = @_; |
54 | $self->result_class('DBIx::Class::ResultClass::HashRefInflator'); |
55 | return $self; |
56 | } |
57 | |
58 | =head2 hashref_array( ) |
59 | |
60 | Calls ->hashref_rs->all and returns depending on the calling context an array or an reference to an array. |
61 | |
62 | my $rs = $schema->resultset('User')->search( { } )->hashref_array; |
63 | print Dumper $rs; |
64 | |
65 | my @rs = $schema->resultset('User')->search( { } )->hashref_array; |
66 | print Dumper @rs; |
67 | |
68 | =cut |
69 | |
70 | sub hashref_array { |
71 | return wantarray ? shift->hashref_rs->all : [ shift->hashref_rs->all ]; |
72 | } |
73 | |
74 | =head2 hashref_first( ) |
75 | |
76 | Returns the first row of the resultset inflated by L<DBIx::Class::ResultClass::HashRefInflator>. |
77 | |
78 | my $first_row = $schema->resultset('User')->search( { } )->hashref_first; |
79 | print Dumper $first_row |
80 | |
81 | =cut |
82 | |
83 | sub hashref_first { |
84 | return shift->hashref_rs->first; |
85 | } |
86 | |
698b98d0 |
87 | =head2 hashref_pk( ) |
88 | |
89 | Calls hashref_array and returns a reference to a hash containing the primary key. For each key the corresponding value is a reference to a hash of the resultset inflated by L<DBIx::Class::ResultClass::HashRefInflator>. |
90 | |
91 | my $hashref_pk = $schema->resultset('User')->search( { } )->hashref_pk; |
92 | print Dumper $hashref_pk |
93 | |
94 | =cut |
95 | |
96 | sub hashref_pk{ |
97 | my $self = shift; |
98 | my @primary_columns = $self->result_source->primary_columns; |
99 | croak "Multi-column primary keys are not supported." if (scalar @primary_columns > 1 ); |
100 | croak "No primary key found." if (scalar @primary_columns == 0 ); |
101 | my $primary_key = shift @primary_columns; |
102 | my %hash_pk = (); |
103 | %hash_pk = map { $_->{$primary_key} => $_ } $self->hashref_array; |
104 | return wantarray ? %hash_pk : \%hash_pk ; |
105 | } |
106 | |
8d028daa |
107 | =head1 AUTHOR |
108 | |
109 | Johannes Plunien E<lt>plu@cpan.orgE<gt> |
110 | |
111 | =head1 COPYRIGHT AND LICENSE |
112 | |
113 | Copyright 2008 by Johannes Plunien |
114 | |
115 | This library is free software; you can redistribute it and/or modify |
116 | it under the same terms as Perl itself. |
117 | |
118 | Thanks to mst for his patience. |
119 | |
120 | =head1 SEE ALSO |
121 | |
122 | =over 4 |
123 | |
124 | =item * L<DBIx::Class> |
125 | |
126 | =item * L<DBIx::Class::ResultClass::HashRefInflator> |
127 | |
128 | =back |
129 | |
130 | =cut |
131 | |
132 | 1; |