| ... | ... |
@@ -256,6 +256,24 @@ sub flat {
|
| 256 | 256 |
return @flat; |
| 257 | 257 |
} |
| 258 | 258 |
|
| 259 |
+sub kv {
|
|
| 260 |
+ my ($self, %opt) = @_; |
|
| 261 |
+ |
|
| 262 |
+ my $key_name = $self->{sth}{NAME}[0];
|
|
| 263 |
+ my $kv = {};
|
|
| 264 |
+ while (my $row = $self->fetch_hash) {
|
|
| 265 |
+ my $key_value = delete $row->{$key_name};
|
|
| 266 |
+ next unless defined $key_value; |
|
| 267 |
+ if ($opt{multi}) {
|
|
| 268 |
+ $kv->{$key_value} ||= [];
|
|
| 269 |
+ push @{$kv->{$key_value}}, $row;
|
|
| 270 |
+ } |
|
| 271 |
+ else { $kv->{$key_value} = $row }
|
|
| 272 |
+ } |
|
| 273 |
+ |
|
| 274 |
+ return $kv; |
|
| 275 |
+} |
|
| 276 |
+ |
|
| 259 | 277 |
sub header { shift->sth->{NAME} }
|
| 260 | 278 |
|
| 261 | 279 |
*one = \&fetch_hash_one; |
| ... | ... |
@@ -596,6 +614,58 @@ You can create key-value pair easily. |
| 596 | 614 |
|
| 597 | 615 |
my %titles = $dbi->select(['id', 'title'])->flat; |
| 598 | 616 |
|
| 617 |
+=head2 C<kv> EXPERIMENTAL |
|
| 618 |
+ |
|
| 619 |
+ my $key_value = $result->kv; |
|
| 620 |
+ my $key_values = $result->kv(multi => 1); |
|
| 621 |
+ |
|
| 622 |
+Get key-value pairs. |
|
| 623 |
+ |
|
| 624 |
+ my $books = $dbi->select(['id', 'title', 'author'])->kv; |
|
| 625 |
+ |
|
| 626 |
+If C<all> method return the following data: |
|
| 627 |
+ |
|
| 628 |
+ [ |
|
| 629 |
+ {id => 1, title => 'Perl', author => 'Ken'},
|
|
| 630 |
+ {id => 2, title => 'Ruby', author => 'Taro'}
|
|
| 631 |
+ ] |
|
| 632 |
+ |
|
| 633 |
+C<kv> method return the following data. |
|
| 634 |
+ |
|
| 635 |
+ {
|
|
| 636 |
+ 1 => {title => 'Perl', author => 'Ken'},
|
|
| 637 |
+ 2 => {title => 'Ruby', author => 'Taro'}
|
|
| 638 |
+ } |
|
| 639 |
+ |
|
| 640 |
+First column value become key. |
|
| 641 |
+ |
|
| 642 |
+If value contains multipule data, you can push it to |
|
| 643 |
+array refernce by C<multi> option. |
|
| 644 |
+ |
|
| 645 |
+ my $books = $dbi->select(['author', 'title', 'price'])->kv(multi => 1); |
|
| 646 |
+ |
|
| 647 |
+If C<all> method return the following data: |
|
| 648 |
+ |
|
| 649 |
+ [ |
|
| 650 |
+ {author => 'Ken', title => 'Perl', price => 1000},
|
|
| 651 |
+ {author => 'Ken', title => 'Good', price => 2000},
|
|
| 652 |
+ {author => 'Taro', title => 'Ruby', price => 3000}
|
|
| 653 |
+ {author => 'Taro', title => 'Sky', price => 4000}
|
|
| 654 |
+ ] |
|
| 655 |
+ |
|
| 656 |
+C<kv> method return the following data. |
|
| 657 |
+ |
|
| 658 |
+ {
|
|
| 659 |
+ Ken => [ |
|
| 660 |
+ {title => 'Perl', price => 1000},
|
|
| 661 |
+ {title => 'Good', price => 2000}
|
|
| 662 |
+ ], |
|
| 663 |
+ Taro => [ |
|
| 664 |
+ {title => 'Ruby', price => 3000},
|
|
| 665 |
+ {title => 'Sky', price => 4000}
|
|
| 666 |
+ ] |
|
| 667 |
+ } |
|
| 668 |
+ |
|
| 599 | 669 |
=head2 C<header> |
| 600 | 670 |
|
| 601 | 671 |
my $header = $result->header; |
| ... | ... |
@@ -3584,6 +3584,39 @@ $result = $dbi->select(table => $table1); |
| 3584 | 3584 |
$rows = [$result->flat]; |
| 3585 | 3585 |
is_deeply($rows, [1, 2, 3, 4]); |
| 3586 | 3586 |
|
| 3587 |
+test 'kv'; |
|
| 3588 |
+$dbi = DBIx::Custom->connect; |
|
| 3589 |
+eval { $dbi->execute("drop table $table1") };
|
|
| 3590 |
+$dbi->execute($create_table1); |
|
| 3591 |
+$dbi->insert({$key1 => 0, $key2 => 2}, table => $table1);
|
|
| 3592 |
+$dbi->insert({$key1 => 3, $key2 => 4}, table => $table1);
|
|
| 3593 |
+ |
|
| 3594 |
+$result = $dbi->select([$key1, $key2], table => $table1, append => "order by $key1"); |
|
| 3595 |
+$rows = $result->kv; |
|
| 3596 |
+is_deeply($rows, {0 => {$key2 => 2}, 3 => {$key2 => 4}});
|
|
| 3597 |
+ |
|
| 3598 |
+$dbi = DBIx::Custom->connect; |
|
| 3599 |
+eval { $dbi->execute("drop table $table1") };
|
|
| 3600 |
+$dbi->execute($create_table1); |
|
| 3601 |
+$dbi->insert({$key1 => 0, $key2 => 1}, table => $table1);
|
|
| 3602 |
+$dbi->insert({$key1 => 0, $key2 => 2}, table => $table1);
|
|
| 3603 |
+$dbi->insert({$key1 => 3, $key2 => 4}, table => $table1);
|
|
| 3604 |
+$dbi->insert({$key1 => 3, $key2 => 5}, table => $table1);
|
|
| 3605 |
+ |
|
| 3606 |
+$result = $dbi->select([$key1, $key2], table => $table1, append => "order by $key2"); |
|
| 3607 |
+$rows = $result->kv(multi => 1); |
|
| 3608 |
+is_deeply($rows, {
|
|
| 3609 |
+ 0 => [ |
|
| 3610 |
+ {$key2 => 1},
|
|
| 3611 |
+ {$key2 => 2}
|
|
| 3612 |
+ ], |
|
| 3613 |
+ 3 => [ |
|
| 3614 |
+ {$key2 => 4},
|
|
| 3615 |
+ {$key2 => 5}
|
|
| 3616 |
+ ] |
|
| 3617 |
+}); |
|
| 3618 |
+ |
|
| 3619 |
+ |
|
| 3587 | 3620 |
test 'DBIx::Custom::Result fetch_multi'; |
| 3588 | 3621 |
eval { $dbi->execute("drop table $table1") };
|
| 3589 | 3622 |
$dbi->execute($create_table1); |