From: Rob Kinyon Date: Mon, 16 Feb 2009 21:27:49 +0000 (+0000) Subject: Added a bit of explanation to resultsets to cut down on the repeated questions in... X-Git-Tag: v0.08240~120 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=f57764b91d51a0c23ff0dd34b11a30689d456b95;p=dbsrgits%2FDBIx-Class.git Added a bit of explanation to resultsets to cut down on the repeated questions in #dbix-class --- diff --git a/lib/DBIx/Class/ResultSet.pm b/lib/DBIx/Class/ResultSet.pm index 24b8981..1d0131a 100644 --- a/lib/DBIx/Class/ResultSet.pm +++ b/lib/DBIx/Class/ResultSet.pm @@ -52,6 +52,86 @@ In the examples below, the following table classes are used: __PACKAGE__->belongs_to(artist => 'MyApp::Schema::Artist'); 1; +=head1 DISCUSSION + +When you create a resultset (usually as a result of calling search()), DBIx::Class +B make a DB call. Not yet. A resultset is (in simplistic terms) a set of +where conditions, join conditions, and other metadata that would be needed to execute +a SELECT statement. This has several big implications: + +=over 4 + +=item * You can chain resultsets + +=item * You can run multiple queries using the same resultset + +=back + +=head2 Chaining resultsets + +Let's say you've got a query that needs to be run to return some data to the user. But, +you have an authorization system in place that prevents certain users from seeing certain +information. So, you want to construct the query in one method, but add constraints to it +in another. + + sub get_data { + my $self = shift; + my $request = $self->get_request; # Get a request object somehow. + my $schema = $self->get_schema; # Get the DBIC schema object somehow. + + my $rs = $schema->resultset('some_data')->search({ + foo => $request->param('foo'), + bar => $request->param('bar'), + }); + + $self->apply_security_policy( $rs ); + + return $rs->all; + } + + sub apply_security_policy { + my $self = shift; + my ($rs) = @_; + + return $rs->search({ + hidden_data => 0, + }); + } + +=head2 Multiple queries + +Since a resultset hasn't hit the database yet, you can do all sorts of things with it. + + # Don't hit the DB yet. + my $rs = $schema->resultset('some_table')->search({ + foo => 1, + bar => 2, + }); + + # Each of these hits the DB individually. + my $count = $rs->count; + my $max_baz = $rs->get_column('baz')->max; + my @records = $rs->all; + +And it's not just limited to SELECT statements. + + $rs->delete; + +This is even cooler + + $rs->create({ baz => 20 }); + +That is equivalent to + + $schema->resultset('some_table')->create({ + foo => 1, + bar => 2, + baz => 20, + }); + +Note that C returns a ResultSetColumn object. This will behave almost +exactly like a resultset, except it has methods tuned for working with columns. + =head1 OVERLOADING If a resultset is used in a numeric context it returns the L.