From: Will Hawes Date: Sat, 21 Jan 2006 21:06:18 +0000 (+0000) Subject: add first draft of intro doc for schema-based use X-Git-Tag: v0.05005~117^2~20 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=8292706e66edd1a95b3af7796aa013285fc842ef;p=dbsrgits%2FDBIx-Class.git add first draft of intro doc for schema-based use --- diff --git a/lib/DBIx/Class/Manual/SchemaIntro.pod b/lib/DBIx/Class/Manual/SchemaIntro.pod new file mode 100644 index 0000000..8bd928f --- /dev/null +++ b/lib/DBIx/Class/Manual/SchemaIntro.pod @@ -0,0 +1,242 @@ +=head1 NAME + +DBIx::Class::Manual::SchemaIntro - Introduction to DBIx::Class::Schema + +=head1 INTRODUCTION + +This document describes how to set up DBIx::Class using the recommended +schema-based approach. + +=head2 Setup + +First, you should create your base schema class, which inherits from +L: + + package My::Schema; + use base qw/DBIx::Class::Schema/; + +In this class you load your resultsource ("table", "model") classes, which +we will define later, using the load_classes() method. You can specify which +classes to load manually: + + # load My::Schema::Album and My::Schema::Artist + __PACKAGE__->load_classes(qw/ Album Artist /); + +Or load classes by namespace: + + # load My::Schema::Album, My::Schema::Artist and My::OtherSchema::LinerNotes + __PACKAGE__->load_classes( + { + 'My::Schema' => qw/ Album Artist /, + 'My::OtherSchema' => qw/ LinerNotes / + } + ); + +Or let your schema class load all classes in its namespace automatically: + + # load My::Schema::* + __PACKAGE__->load_classes(); + +Next, create each of the classes you want to load as specified above: + + package My::Schema::Album; + use base qw/DBIx::Class/; + +Load any components required by each class with the load_components() method. +This should consist of "Core" plus any additional components you want to use. +For example, if you use SQLite and want serial/auto-incrementing primary keys: + + __PACKAGE__->load_components(qw/ PK::Auto::SQLite Core /); + +C classes exist for many databases; see +L for more information. + +Set the table for your class: + + __PACKAGE__->table('album'); + +Add columns to your class: + + __PACKAGE__->add_columns(qw/ albumid artist title /); + +Accessors are created for each column automatically, so My::Schema::Album will +have albumid(), artist() and title() methods. + +Define a primary key for your class: + + __PACKAGE__->set_primary_key('albumid'); + +If you have a multi-column primary key, just pass a list instead: + + __PACKAGE__->set_primary_key( qw/ albumid artistid / ); + +You can define relationships for any of your classes. L will +automatically fill in the correct namespace, so if you want to say +"a My::Schema::Album object belongs to a My::Schema::Artist object" you do not +need to include the namespace when declaring the relationship: + + __PACKAGE__->belongs_to('artist' => 'Artist'); + +That's all you need in terms of setup. + +=head2 Usage + +In your application code, you should first create a connected schema object: + + my $schema = My::Schema->connect( $dsn, $user, $password, $attrs ); + +You can create as many different schema instances as you need. So if you have +a second database you want to access: + + my $other_schema = My::Schema->connect( $dsn, $user, $password, $attrs ); + +Note that L does not cache connnections for you. If you +use multiple connections, you need to do this manually. + +The simplest way to get a record is by primary key: + + my $schema = My::Schema->connect( ... ); + my $album = $schema->resultset('Album')->find(14); + +This will run a C