X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FResultSource%2FView.pm;h=3dde9bd3b8c8ea48959c5d21d892d5c2131d317b;hb=d88ecca6486a2b1c4b6e2f0440165b186aab39bc;hp=7d6ec12e63f51a1151b9d62ed05e60f0105fc988;hpb=1d521afde80ce560e448083985c5bed8376bda5d;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/ResultSource/View.pm b/lib/DBIx/Class/ResultSource/View.pm index 7d6ec12..3dde9bd 100644 --- a/lib/DBIx/Class/ResultSource/View.pm +++ b/lib/DBIx/Class/ResultSource/View.pm @@ -7,32 +7,144 @@ use DBIx::Class::ResultSet; use base qw/DBIx::Class/; __PACKAGE__->load_components(qw/ResultSource/); - - - _columns _primaries _unique_constraints name resultset_attributes - schema from _relationships column_info_from_storage source_info - source_name/); - +__PACKAGE__->mk_group_accessors( + 'simple' => qw(is_virtual view_definition) +); =head1 NAME -DBIx::Class::ResultSource::Table - Table object +DBIx::Class::ResultSource::View - ResultSource object representing a view =head1 SYNOPSIS + package MyDB::Schema::Result::Year2000CDs; + + use base qw/DBIx::Class::Core/; + + __PACKAGE__->table_class('DBIx::Class::ResultSource::View'); + + __PACKAGE__->table('year2000cds'); + __PACKAGE__->result_source_instance->is_virtual(1); + __PACKAGE__->result_source_instance->view_definition( + "SELECT cdid, artist, title FROM cd WHERE year ='2000'" + ); + __PACKAGE__->add_columns( + 'cdid' => { + data_type => 'integer', + is_auto_increment => 1, + }, + 'artist' => { + data_type => 'integer', + }, + 'title' => { + data_type => 'varchar', + size => 100, + }, + ); + =head1 DESCRIPTION -Table object that inherits from L +View object that inherits from L + +This class extends ResultSource to add basic view support. + +A view has a L, which contains a SQL query. The query can +only have parameters if L is set to true. It may contain JOINs, +sub selects and any other SQL your database supports. + +View definition SQL is deployed to your database on +L unless you set L to true. + +Deploying the view does B translate it between different database +syntaxes, so be careful what you write in your view SQL. + +Virtual views (L true), are assumed to not +exist in your database as a real view. The L in this +case replaces the view name in a FROM clause in a subselect. + +=head1 EXAMPLES + +Having created the MyDB::Schema::Year2000CDs schema as shown in the SYNOPSIS +above, you can then: + + $2000_cds = $schema->resultset('Year2000CDs') + ->search() + ->all(); + $count = $schema->resultset('Year2000CDs') + ->search() + ->count(); + +If you modified the schema to include a placeholder + + __PACKAGE__->result_source_instance->view_definition( + "SELECT cdid, artist, title FROM cd WHERE year ='?'" + ); + +and ensuring you have is_virtual set to true: + + __PACKAGE__->result_source_instance->is_virtual(1); + +You could now say: + + $2001_cds = $schema->resultset('Year2000CDs') + ->search({}, { bind => [2001] }) + ->all(); + $count = $schema->resultset('Year2000CDs') + ->search({}, { bind => [2001] }) + ->count(); + +=head1 SQL EXAMPLES + +=over + +=item is_virtual set to false + + $schema->resultset('Year2000CDs')->all(); + + SELECT cdid, artist, title FROM year2000cds me + +=item is_virtual set to true + + $schema->resultset('Year2000CDs')->all(); + + SELECT cdid, artist, title FROM + (SELECT cdid, artist, title FROM cd WHERE year ='2000') me + +=back =head1 METHODS +=head2 is_virtual + + __PACKAGE__->result_source_instance->is_virtual(1); + +Set to true for a virtual view, false or unset for a real +database-based view. + +=head2 view_definition + + __PACKAGE__->result_source_instance->view_definition( + "SELECT cdid, artist, title FROM cd WHERE year ='2000'" + ); + +An SQL query for your view. Will not be translated across database +syntaxes. + + +=head1 OVERRIDDEN METHODS + =head2 from Returns the FROM entry for the table (i.e. the view name) +or the SQL as a subselect if this is a virtual view. =cut -sub from { shift->name; } +sub from { + my $self = shift; + return \"(${\$self->view_definition})" if $self->is_virtual; + return $self->name; +} 1; @@ -44,6 +156,10 @@ With Contributions from: Guillermo Roditi Egroditi@cpan.orgE +Jess Robinson + +Wallace Reis + =head1 LICENSE You may distribute this code under the same terms as Perl itself.