| ... | ... |
@@ -580,6 +580,92 @@ sub delete_all {
|
| 580 | 580 |
return $self->delete($table, {}, undef, {allow_delete_all => 1});
|
| 581 | 581 |
} |
| 582 | 582 |
|
| 583 |
+sub _select_usage { return << 'EOS' }
|
|
| 584 |
+Usage select : |
|
| 585 |
+$dbi->select( |
|
| 586 |
+ $table, # must be string |
|
| 587 |
+ [@$columns], # must be array reference. this is optional |
|
| 588 |
+ {%$where_params}, # must be hash reference. this is optional
|
|
| 589 |
+ $append_statement, # must be string. this is optional |
|
| 590 |
+ $query_edit_callback # must be code reference. this is optional |
|
| 591 |
+); |
|
| 592 |
+EOS |
|
| 593 |
+ |
|
| 594 |
+sub select {
|
|
| 595 |
+ my $self = shift; |
|
| 596 |
+ |
|
| 597 |
+ # Check argument |
|
| 598 |
+ croak($self->_select_usage) unless @_; |
|
| 599 |
+ |
|
| 600 |
+ # Arguments |
|
| 601 |
+ my $tables = shift || ''; |
|
| 602 |
+ $tables = [$tables] unless ref $tables; |
|
| 603 |
+ |
|
| 604 |
+ my $columns = ref $_[0] eq 'ARRAY' ? shift : []; |
|
| 605 |
+ my $where_params = ref $_[0] eq 'HASH' ? shift : {};
|
|
| 606 |
+ my $append_statement = shift unless ref $_[0] || ''; |
|
| 607 |
+ my $query_edit_cb = shift if ref $_[0] eq 'CODE'; |
|
| 608 |
+ |
|
| 609 |
+ # Check rest argument |
|
| 610 |
+ croak($self->_select_usage) unless @_; |
|
| 611 |
+ |
|
| 612 |
+ # SQL template for select statement |
|
| 613 |
+ my $template = 'select '; |
|
| 614 |
+ |
|
| 615 |
+ # Join column clause |
|
| 616 |
+ if (@$columns) {
|
|
| 617 |
+ foreach my $column (@$columns) {
|
|
| 618 |
+ $template .= "$column, "; |
|
| 619 |
+ } |
|
| 620 |
+ $template .= s/, $/ /; |
|
| 621 |
+ } |
|
| 622 |
+ else {
|
|
| 623 |
+ $template .= '* '; |
|
| 624 |
+ } |
|
| 625 |
+ |
|
| 626 |
+ # Join table |
|
| 627 |
+ foreach my $table (@$tables) {
|
|
| 628 |
+ $template .= "$table, "; |
|
| 629 |
+ } |
|
| 630 |
+ $template =~ s/, / /; |
|
| 631 |
+ |
|
| 632 |
+ # Where clause keys |
|
| 633 |
+ my @where_keys = keys %$where_params; |
|
| 634 |
+ |
|
| 635 |
+ # Join where clause |
|
| 636 |
+ if (@where_keys) {
|
|
| 637 |
+ $template .= 'where '; |
|
| 638 |
+ foreach my $where_key (@where_keys) {
|
|
| 639 |
+ $template .= "{= $where_key} && ";
|
|
| 640 |
+ } |
|
| 641 |
+ } |
|
| 642 |
+ $template =~ s/ && $//; |
|
| 643 |
+ |
|
| 644 |
+ # Append something to last of statement |
|
| 645 |
+ if ($append_statement =~ s/^where //) {
|
|
| 646 |
+ if (@where_keys) {
|
|
| 647 |
+ $template .= " && $append_statement"; |
|
| 648 |
+ } |
|
| 649 |
+ else {
|
|
| 650 |
+ $template .= " where $append_statement"; |
|
| 651 |
+ } |
|
| 652 |
+ } |
|
| 653 |
+ else {
|
|
| 654 |
+ $template .= " $append_statement"; |
|
| 655 |
+ } |
|
| 656 |
+ |
|
| 657 |
+ # Create query |
|
| 658 |
+ my $query = $self->create_query($template); |
|
| 659 |
+ |
|
| 660 |
+ # Query edit |
|
| 661 |
+ $query_edit_cb->($query) if $query_edit_cb; |
|
| 662 |
+ |
|
| 663 |
+ # Execute query |
|
| 664 |
+ my $result = $self->execute($query, $where_params); |
|
| 665 |
+ |
|
| 666 |
+ return $result; |
|
| 667 |
+} |
|
| 668 |
+ |
|
| 583 | 669 |
sub _query_caches : ClassAttr { type => 'hash',
|
| 584 | 670 |
auto_build => sub {shift->_query_caches({}) } }
|
| 585 | 671 |
|
| ... | ... |
@@ -909,6 +995,39 @@ If tranzation is died, rollback is execute. |
| 909 | 995 |
|
| 910 | 996 |
This method is same as DBI last_insert_id; |
| 911 | 997 |
|
| 998 |
+=head2 select |
|
| 999 |
+ |
|
| 1000 |
+ # Select |
|
| 1001 |
+ $dbi->select( |
|
| 1002 |
+ $table, # must be string or array; |
|
| 1003 |
+ [@$columns], # must be array reference. this is optional |
|
| 1004 |
+ {%$where_params}, # must be hash reference. this is optional
|
|
| 1005 |
+ $append_statement, # must be string. this is optional |
|
| 1006 |
+ $query_edit_callback # must be code reference. this is optional |
|
| 1007 |
+ ); |
|
| 1008 |
+ |
|
| 1009 |
+ # Sample |
|
| 1010 |
+ $dbi->select( |
|
| 1011 |
+ 'Books', |
|
| 1012 |
+ ['title', 'author'], |
|
| 1013 |
+ {id => 1},
|
|
| 1014 |
+ "for update", |
|
| 1015 |
+ sub {
|
|
| 1016 |
+ my $query = shift; |
|
| 1017 |
+ $query->bind_filter(sub {
|
|
| 1018 |
+ # ... |
|
| 1019 |
+ }); |
|
| 1020 |
+ } |
|
| 1021 |
+ ); |
|
| 1022 |
+ |
|
| 1023 |
+ # The way to join multi tables |
|
| 1024 |
+ $dbi->select( |
|
| 1025 |
+ ['table1', 'table2'], |
|
| 1026 |
+ ['table1.id as table1_id', 'title'], |
|
| 1027 |
+ {table1.id => 1},
|
|
| 1028 |
+ "where table1.id = table2.id", |
|
| 1029 |
+ ); |
|
| 1030 |
+ |
|
| 912 | 1031 |
=head1 Class Accessors |
| 913 | 1032 |
|
| 914 | 1033 |
=head2 query_cache_max |