Showing 2 changed files with 103 additions and 0 deletions
+70
lib/DBIx/Custom/Result.pm
... ...
@@ -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;
+33
t/common.t
... ...
@@ -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);