=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', 'testuser', 'testpass'); 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