X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FResultSet.pm;h=597eef5e4e900fa67c78ab6fdabfddc466d51e12;hb=c2074366cb27cd61f218bc6445ab25c2c6b0a3a0;hp=6178af7e577dfc67223d7c96be7f5fbd4f206539;hpb=ee38fa40d848a164040097286b4440d4b64565e8;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/ResultSet.pm b/lib/DBIx/Class/ResultSet.pm index 6178af7..597eef5 100644 --- a/lib/DBIx/Class/ResultSet.pm +++ b/lib/DBIx/Class/ResultSet.pm @@ -9,24 +9,26 @@ use Data::Page; =head1 NAME -DBIX::Class::Recordset - Responsible for fetching and creating recordsets. +DBIx::Class::ResultSet - Responsible for fetching and creating resultset. -=head1 SYNOPSIS; +=head1 SYNOPSIS -$rs=MyApp::DB::Class->search(registered=>1); +my $rs = MyApp::DB::Class->search(registered => 1); +my @rows = MyApp::DB::Class->search(foo => 'bar'); =head1 DESCRIPTION -The recordset is also know as an iterator. +The resultset is also known as an iterator. It is responsible for handling +queries that may return an arbitrary number of rows, e.g. via C +or a C relationship. =head1 METHODS -=over 4 +=head2 new($db_class, \%$attrs) -=item new - -The recordset constructor. Takes a db class and an -attribute hash (see below for more info on attributes) +The resultset constructor. Takes a table class and an attribute hash +(see below for more information on attributes). Does not perform +any queries -- these are executed as needed by the other methods. =cut @@ -69,9 +71,9 @@ sub new { return $new; } -=item cursor +=head2 cursor -Return a storage driven cursor to the given record set. +Return a storage-driven cursor to the given resultset. =cut @@ -87,9 +89,9 @@ sub cursor { $attrs->{where},$attrs); } -=item slice +=head2 slice($first, $last) -return a number of elements from the given record set. +Returns a subset of elements from the resultset. =cut @@ -103,9 +105,9 @@ sub slice { return (wantarray ? $slice->all : $slice); } -=item next +=head2 next -Returns the next element in this record set. +Returns the next element in the resultset (undef is there is none). =cut @@ -118,7 +120,9 @@ sub next { sub _construct_object { my ($self, @row) = @_; - my @cols = $self->{class}->_select_columns; + my @cols = @{ $self->{attrs}{cols} }; + s/^me\.// for @cols; + @cols = grep { /\(/ or ! /\./ } @cols; my $new; unless ($self->{attrs}{prefetch}) { $new = $self->{class}->_row_to_object(\@cols, \@row); @@ -135,7 +139,10 @@ sub _construct_object { unless defined $rel_obj->{attrs}{accessor}; if ($rel_obj->{attrs}{accessor} eq 'single') { foreach my $pri ($rel_obj->{class}->primary_columns) { - next PRE unless defined $fetched->get_column($pri); + unless (defined $fetched->get_column($pri)) { + undef $fetched; + last; + } } $new->{_relationship_data}{$pre} = $fetched; } elsif ($rel_obj->{attrs}{accessor} eq 'filter') { @@ -150,14 +157,13 @@ sub _construct_object { return $new; } -=item count +=head2 count -Performs an SQL count with the same query as the resultset was built +Performs an SQL C with the same query as the resultset was built with to find the number of elements. =cut - sub count { my ($self) = @_; my $db_class = $self->{class}; @@ -177,10 +183,10 @@ sub count { : $self->{count}; } -=item all +=head2 all -Returns all elements in the recordset. Is called implictly if the search -method is used in list context. +Returns all elements in the resultset. Called implictly if the resultset +is returned in list context. =cut @@ -190,9 +196,9 @@ sub all { $self->cursor->all; } -=item reset +=head2 reset -Reset this recordset's cursor, so you can iterate through the elements again. +Resets the resultset's cursor, so you can iterate through the elements again. =cut @@ -202,9 +208,9 @@ sub reset { return $self; } -=item first +=head2 first -resets the recordset and returns the first element. +Resets the resultset and returns the first element. =cut @@ -212,9 +218,9 @@ sub first { return $_[0]->reset->next; } -=item delete +=head2 delete -Deletes all elements in the recordset. +Deletes all elements in the resultset. =cut @@ -226,7 +232,7 @@ sub delete { *delete_all = \&delete; # Yeah, yeah, yeah ... -=item pager +=head2 pager Returns a L object for the current resultset. Only makes sense for queries with page turned on. @@ -244,9 +250,9 @@ sub pager { return $self->{pager}; } -=item page +=head2 page($page_num) -Returns a new recordset representing a given page. +Returns a new resultset for the specified page. =cut @@ -257,54 +263,56 @@ sub page { return $self->new($self->{class}, $attrs); } -=back - =head1 Attributes -The recordset is responsible for handling the various attributes that -can be passed in with the search functions. Here's an overview of them: +The resultset takes various attributes that modify its behavior. +Here's an overview of them: -=over 4 +=head2 order_by -=item order_by +Which column(s) to order the results by. This is currently passed +through directly to SQL, so you can give e.g. C for a +descending order. -Which column to order the results by. +=head2 cols -=item cols +Which columns should be retrieved. -Which cols should be retrieved on the first search. +=head2 join -=item join +Contains a list of relationships that should be joined for this query. Can also +contain a hash reference to refer to that relation's relations. So, if one column +in your class C foo and another C bar, you can do +C<< join => [qw/ foo bar /] >> to join both (and e.g. use them for C). +If a foo contains many margles and you want to join those too, you can do +C<< join => { foo => 'margle' } >>. If you want to fetch the columns from the +related table as well, see C below. -Contains a list of relations that should be joined for this query. Can also -contain a hash referece to refer to that relation's relations. +=head2 prefetch -=item from +Contains a list of relationships that should be fetched along with the main +query (when they are accessed afterwards they will have already been +"prefetched"). This is useful for when you know you will need the related +object(s), because it saves a query. Currently limited to prefetching +one relationship deep, so unlike C, prefetch must be an arrayref. -This attribute can contain a arrayref of elements. each element can be another +=head2 from + +This attribute can contain a arrayref of elements. Each element can be another arrayref, to nest joins, or it can be a hash which represents the two sides of the join. -*NOTE* Use this on your own risk. This allows you to shoot your foot off! - -=item page +NOTE: Use this on your own risk. This allows you to shoot your foot off! -Should the resultset be paged? This can also be enabled by using the -'page' option. +=head2 page -=item rows +For a paged resultset, specifies which page to retrieve. Leave unset +for an unpaged resultset. -For paged resultsset, how many rows per page +=head2 rows -=item offset +For a paged resultset, how many rows per page -For paged resultsset, which page to start on. - -=item accesor - -Tells the recordset how to prefetch relations. Can either be 'single' or -'filter'. - -=back +=cut 1;