From: Matt S Trout Date: Sun, 26 Feb 2006 19:52:16 +0000 (+0000) Subject: Added Manual::Example from sc_ X-Git-Tag: v0.06000~83 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=022e08938d8fed4bbfc4a9d2e7c00f54a48c7bd1;p=dbsrgits%2FDBIx-Class.git Added Manual::Example from sc_ --- diff --git a/lib/DBIx/Class.pm b/lib/DBIx/Class.pm index 56fe277..8e44c89 100644 --- a/lib/DBIx/Class.pm +++ b/lib/DBIx/Class.pm @@ -162,6 +162,8 @@ Brandon Black Scotty Allen +sc_ + =head1 LICENSE You may distribute this code under the same terms as Perl itself. diff --git a/lib/DBIx/Class/Manual/Example.pod b/lib/DBIx/Class/Manual/Example.pod new file mode 100644 index 0000000..c31c739 --- /dev/null +++ b/lib/DBIx/Class/Manual/Example.pod @@ -0,0 +1,293 @@ +=head1 NAME + +DBIx::Class::Manual::Example - Simple CD database example + +=head1 DESCRIPTION + +This tutorial will guide you through the proeccess of setting up and testing a very basic CD database using Mysql, with DBIx::Class::Schema as the database frontend. + +The database consists of the following: + + table 'artist' with columns: artistid, name + table 'cd' with columns: cdid, artist, title + table 'track' with columns: trackid, cd, title + + +And these rules exists: + + one artist can have many cds + one cd belongs to one artist + one cd can have many tracks + one track belongs to one cd + + +=head2 Installation + +=head3 Create the database/tables and populate them with a few records + + CREATE DATABASE cdtestdb ; + USE cdtestdb; + + CREATE TABLE artist ( + artistid INT NOT NULL AUTO_INCREMENT , + name CHAR( 40 ) NOT NULL , + PRIMARY KEY ( artistid ) + ); + + CREATE TABLE cd ( + cdid INT NOT NULL AUTO_INCREMENT , + artist INT NOT NULL , + title CHAR( 40 ) NOT NULL , + PRIMARY KEY ( cdid ) + ); + + CREATE TABLE track ( + trackid INT NOT NULL AUTO_INCREMENT , + cd INT NOT NULL , + title CHAR( 40 ) NOT NULL , + PRIMARY KEY ( trackid ) + ; + + + INSERT INTO artist VALUES + (NULL,'Michael Jackson'), + (NULL,'Eminem'); + + INSERT INTO cd VALUES + (NULL,'1','Thriller'), + (NULL,'1','Bad'), + (NULL,'2','The Marshall Mathers LP'); + + INSERT INTO track VALUES + (NULL,'1','Beat it'), + (NULL,'1','Billie Jean'), + (NULL,'2','Dirty Diana'), + (NULL,'2','Smooth Criminal'), + (NULL,'2','Leave Me Alone'), + (NULL,'3','Stan'), + (NULL,'3','The Way I Am'); + + + +=head3 Set up DBIx::Class::Schema + +First, create some dirs and change working directory: + + mkdir app + mkdir app/DB + mkdir app/DB/Main + cd app + + +Then, create the following DBIx::Class::Schema classes: + +DB/Main.pm: + + package DB::Main; + use base qw/DBIx::Class::Schema/; + __PACKAGE__->load_classes(qw/Artist CD Track/); + + 1; + + +DB/Main/Artist.pm: + + package DB::Main::Artist; + use base qw/DBIx::Class/; + __PACKAGE__->load_components(qw/Core/); + __PACKAGE__->table('artist'); + __PACKAGE__->add_columns(qw/ artistid name /); + __PACKAGE__->set_primary_key('artistid'); + __PACKAGE__->has_many('cds' => 'DB::Main::CD'); + + 1; + + +DB/Main/CD.pm: + + package DB::Main::CD; + use base qw/DBIx::Class/; + __PACKAGE__->load_components(qw/Core/); + __PACKAGE__->table('cd'); + __PACKAGE__->add_columns(qw/ cdid artist title/); + __PACKAGE__->set_primary_key('cdid'); + __PACKAGE__->belongs_to('artist' => 'DB::Main::Artist'); + __PACKAGE__->has_many('tracks' => 'DB::Main::Track'); + + 1; + + +DB/Main/Track.pm: + + package DB::Main::Track; + use base qw/DBIx::Class/; + __PACKAGE__->load_components(qw/Core/); + __PACKAGE__->table('track'); + __PACKAGE__->add_columns(qw/ trackid cd title/); + __PACKAGE__->set_primary_key('trackid'); + __PACKAGE__->belongs_to('cd' => 'DB::Main::CD'); + + 1; + + +=head3 Create and run the test script + +testdb.pl: + + #!/usr/bin/perl -w + + use DB::Main; + use strict; + + my $schema = DB::Main->connect('dbi:mysql:cdtestdb', 'serval', 'TNOownage'); + + get_tracks_by_cd('Bad'); + get_tracks_by_artist('Michael Jackson'); + + get_cd_by_track('Stan'); + get_cds_by_artist('Michael Jackson'); + + get_artist_by_track('Dirty Diana'); + get_artist_by_cd('The Marshall Mathers LP'); + + + sub get_tracks_by_cd { + my $cdtitle = shift; + print "get_tracks_by_cd($cdtitle):\n"; + my $rs = $schema->resultset('Track')->search( + { + 'cd.title' => $cdtitle + }, + { + join => [qw/ cd /], + prefetch => [qw/ cd /] + } + ); + while (my $track = $rs->next) { + print $track->title . "\n"; + } + print "\n"; + } + + sub get_tracks_by_artist { + my $artistname = shift; + print "get_tracks_by_artist($artistname):\n"; + my $rs = $schema->resultset('Track')->search( + { + 'artist.name' => $artistname + }, + { + join => { + 'cd' => 'artist' + }, + } + ); + while (my $track = $rs->next) { + print $track->title . "\n"; + } + print "\n"; + } + + + + sub get_cd_by_track { + my $tracktitle = shift; + print "get_cd_by_track($tracktitle):\n"; + my $rs = $schema->resultset('CD')->search( + { + 'tracks.title' => $tracktitle + }, + { + join => [qw/ tracks /], + } + ); + my $cd = $rs->first; + print $cd->title . "\n\n"; + } + + sub get_cds_by_artist { + my $artistname = shift; + print "get_cds_by_artist($artistname):\n"; + my $rs = $schema->resultset('CD')->search( + { + 'artist.name' => $artistname + }, + { + join => [qw/ artist /], + prefetch => [qw/ artist /] + } + ); + while (my $cd = $rs->next) { + print $cd->title . "\n"; + } + print "\n"; + } + + + + sub get_artist_by_track { + my $tracktitle = shift; + print "get_artist_by_track($tracktitle):\n"; + my $rs = $schema->resultset('Artist')->search( + { + 'tracks.title' => $tracktitle + }, + { + join => { + 'cds' => 'tracks' + } + } + ); + my $artist = $rs->first; + print $artist->name . "\n\n"; + } + + sub get_artist_by_cd { + my $cdtitle = shift; + print "get_artist_by_cd($cdtitle):\n"; + my $rs = $schema->resultset('Artist')->search( + { + 'cds.title' => $cdtitle + }, + { + join => [qw/ cds /], + } + ); + my $artist = $rs->first; + print $artist->name . "\n\n"; + } + + + +It should output: + + get_tracks_by_cd(Bad): + Dirty Diana + Smooth Criminal + Leave Me Alone + + get_tracks_by_artist(Michael Jackson): + Beat it + Billie Jean + Dirty Diana + Smooth Criminal + Leave Me Alone + + get_cd_by_track(Stan): + The Marshall Mathers LP + + get_cds_by_artist(Michael Jackson): + Thriller + Bad + + get_artist_by_track(Dirty Diana): + Michael Jackson + + get_artist_by_cd(The Marshall Mathers LP): + Eminem + +=head1 AUTHOR + + sc_ + +=cut