Adding more manual bits to main Manual.pod
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class.pm
CommitLineData
ea2e61bf 1package DBIx::Class;
2
5d283305 3use strict;
4use warnings;
5
329d7385 6use MRO::Compat;
d38cd95c 7use mro 'c3';
329d7385 8
2527233b 9use DBIx::Class::Optional::Dependencies;
10
5d283305 11use vars qw($VERSION);
d38cd95c 12use base qw/DBIx::Class::Componentised Class::Accessor::Grouped/;
11736b4c 13use DBIx::Class::StartupCheck;
3e110410 14
ade0fe3b 15sub mk_classdata {
77d518d1 16 shift->mk_classaccessor(@_);
17}
18
19sub mk_classaccessor {
20 my $self = shift;
ade0fe3b 21 $self->mk_group_accessors('inherited', $_[0]);
77d518d1 22 $self->set_inherited(@_) if @_ > 1;
3e110410 23}
3c0068c1 24
7411204b 25sub component_base_class { 'DBIx::Class' }
227d4dee 26
95da6f35 27# Always remember to do all digits for the version even if they're 0
28# i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports
29# brain damage and presumably various other packaging systems too
9cb65474 30$VERSION = '0.08123_01';
748ab0dc 31
033955f9 32$VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
b8777a0d 33
f0750722 34sub MODIFY_CODE_ATTRIBUTES {
b5d2c57f 35 my ($class,$code,@attrs) = @_;
36 $class->mk_classdata('__attr_cache' => {})
37 unless $class->can('__attr_cache');
38 $class->__attr_cache->{$code} = [@attrs];
39 return ();
f0750722 40}
41
da95b45f 42sub _attr_cache {
b5d2c57f 43 my $self = shift;
44 my $cache = $self->can('__attr_cache') ? $self->__attr_cache : {};
9780718f 45
46 return {
47 %$cache,
48 %{ $self->maybe::next::method || {} },
20674fcd 49 };
da95b45f 50}
51
ea2e61bf 521;
34d52be2 53
75d07914 54=head1 NAME
34d52be2 55
7e4b2f59 56DBIx::Class - Extensible and flexible object <-> relational mapper.
34d52be2 57
3b1c2bbd 58=head1 GETTING HELP/SUPPORT
59
60The community can be found via:
61
a06e1181 62=over
3b1c2bbd 63
c6fdaf2a 64=item * IRC: irc.perl.org#dbix-class
65
66=for html
e3194e31 67<a href="http://chat.mibbit.com/#dbix-class@irc.perl.org">(click for instant chatroom login)</a>
3b1c2bbd 68
a06e1181 69=item * Mailing list: L<http://lists.scsys.co.uk/mailman/listinfo/dbix-class>
3b1c2bbd 70
a06e1181 71=item * RT Bug Tracker: L<https://rt.cpan.org/Dist/Display.html?Queue=DBIx-Class>
72
aeb669b8 73=item * gitweb: L<http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits/DBIx-Class.git>
a06e1181 74
aeb669b8 75=item * git: L<git://git.shadowcat.co.uk/dbsrgits/DBIx-Class.git>
a06e1181 76
77=back
3b1c2bbd 78
34d52be2 79=head1 SYNOPSIS
80
bd077b47 81Create a schema class called MyDB/Schema.pm:
34d52be2 82
bd077b47 83 package MyDB::Schema;
a0638a7b 84 use base qw/DBIx::Class::Schema/;
34d52be2 85
f0bb26f3 86 __PACKAGE__->load_namespaces();
daec44b8 87
a0638a7b 88 1;
daec44b8 89
30e1753a 90Create a result class to represent artists, who have many CDs, in
f0bb26f3 91MyDB/Schema/Result/Artist.pm:
daec44b8 92
30e1753a 93See L<DBIx::Class::ResultSource> for docs on defining result classes.
94
f0bb26f3 95 package MyDB::Schema::Result::Artist;
d88ecca6 96 use base qw/DBIx::Class::Core/;
daec44b8 97
a0638a7b 98 __PACKAGE__->table('artist');
99 __PACKAGE__->add_columns(qw/ artistid name /);
100 __PACKAGE__->set_primary_key('artistid');
f0bb26f3 101 __PACKAGE__->has_many(cds => 'MyDB::Schema::Result::CD');
daec44b8 102
a0638a7b 103 1;
daec44b8 104
30e1753a 105A result class to represent a CD, which belongs to an artist, in
f0bb26f3 106MyDB/Schema/Result/CD.pm:
39fe0e65 107
f0bb26f3 108 package MyDB::Schema::Result::CD;
d88ecca6 109 use base qw/DBIx::Class::Core/;
39fe0e65 110
d88ecca6 111 __PACKAGE__->load_components(qw/InflateColumn::DateTime/);
a0638a7b 112 __PACKAGE__->table('cd');
bd077b47 113 __PACKAGE__->add_columns(qw/ cdid artistid title year /);
a0638a7b 114 __PACKAGE__->set_primary_key('cdid');
bd077b47 115 __PACKAGE__->belongs_to(artist => 'MyDB::Schema::Artist', 'artistid');
39fe0e65 116
a0638a7b 117 1;
39fe0e65 118
a0638a7b 119Then you can use these classes in your application's code:
39fe0e65 120
a0638a7b 121 # Connect to your database.
bd077b47 122 use MyDB::Schema;
123 my $schema = MyDB::Schema->connect($dbi_dsn, $user, $pass, \%dbi_params);
a0638a7b 124
125 # Query for all artists and put them in an array,
126 # or retrieve them as a result set object.
30e1753a 127 # $schema->resultset returns a DBIx::Class::ResultSet
2053ab2a 128 my @all_artists = $schema->resultset('Artist')->all;
129 my $all_artists_rs = $schema->resultset('Artist');
126042ee 130
30e1753a 131 # Output all artists names
4e8ffded 132 # $artist here is a DBIx::Class::Row, which has accessors
16ccb4fe 133 # for all its columns. Rows are also subclasses of your Result class.
85067746 134 foreach $artist (@all_artists) {
30e1753a 135 print $artist->name, "\n";
136 }
137
a0638a7b 138 # Create a result set to search for artists.
86beca1d 139 # This does not query the DB.
2053ab2a 140 my $johns_rs = $schema->resultset('Artist')->search(
6576ef54 141 # Build your WHERE using an SQL::Abstract structure:
2053ab2a 142 { name => { like => 'John%' } }
a0638a7b 143 );
39fe0e65 144
2053ab2a 145 # Execute a joined query to get the cds.
a0638a7b 146 my @all_john_cds = $johns_rs->search_related('cds')->all;
448c8424 147
f0bb26f3 148 # Fetch the next available row.
a0638a7b 149 my $first_john = $johns_rs->next;
448c8424 150
2053ab2a 151 # Specify ORDER BY on the query.
a0638a7b 152 my $first_john_cds_by_title_rs = $first_john->cds(
153 undef,
154 { order_by => 'title' }
155 );
448c8424 156
bd077b47 157 # Create a result set that will fetch the artist data
2053ab2a 158 # at the same time as it fetches CDs, using only one query.
884559b1 159 my $millennium_cds_rs = $schema->resultset('CD')->search(
a0638a7b 160 { year => 2000 },
161 { prefetch => 'artist' }
162 );
448c8424 163
880a1a0c 164 my $cd = $millennium_cds_rs->next; # SELECT ... FROM cds JOIN artists ...
bd077b47 165 my $cd_artist_name = $cd->artist->name; # Already has the data so no 2nd query
076652e8 166
264f1571 167 # new() makes a DBIx::Class::Row object but doesnt insert it into the DB.
168 # create() is the same as new() then insert().
884559b1 169 my $new_cd = $schema->resultset('CD')->new({ title => 'Spoon' });
f183eccd 170 $new_cd->artist($cd->artist);
f183eccd 171 $new_cd->insert; # Auto-increment primary key filled in after INSERT
f183eccd 172 $new_cd->title('Fork');
173
884559b1 174 $schema->txn_do(sub { $new_cd->update }); # Runs the update in a transaction
f183eccd 175
bd077b47 176 # change the year of all the millennium CDs at once
177 $millennium_cds_rs->update({ year => 2002 });
f183eccd 178
179=head1 DESCRIPTION
180
181This is an SQL to OO mapper with an object API inspired by L<Class::DBI>
bd077b47 182(with a compatibility layer as a springboard for porting) and a resultset API
f183eccd 183that allows abstract encapsulation of database operations. It aims to make
184representing queries in your code as perl-ish as possible while still
a0638a7b 185providing access to as many of the capabilities of the database as possible,
f183eccd 186including retrieving related records from multiple tables in a single query,
bd077b47 187JOIN, LEFT JOIN, COUNT, DISTINCT, GROUP BY, ORDER BY and HAVING support.
f183eccd 188
189DBIx::Class can handle multi-column primary and foreign keys, complex
190queries and database-level paging, and does its best to only query the
75d07914 191database in order to return something you've directly asked for. If a
192resultset is used as an iterator it only fetches rows off the statement
193handle as requested in order to minimise memory usage. It has auto-increment
2053ab2a 194support for SQLite, MySQL, PostgreSQL, Oracle, SQL Server and DB2 and is
195known to be used in production on at least the first four, and is fork-
75d07914 196and thread-safe out of the box (although your DBD may not be).
f183eccd 197
dfccde48 198This project is still under rapid development, so large new features may be
199marked EXPERIMENTAL - such APIs are still usable but may have edge bugs.
200Failing test cases are *always* welcome and point releases are put out rapidly
201as bugs are found and fixed.
202
203We do our best to maintain full backwards compatibility for published
204APIs, since DBIx::Class is used in production in many organisations,
205and even backwards incompatible changes to non-published APIs will be fixed
206if they're reported and doing so doesn't cost the codebase anything.
207
264f1571 208The test suite is quite substantial, and several developer releases
209are generally made to CPAN before the branch for the next release is
210merged back to trunk for a major release.
f183eccd 211
f183eccd 212=head1 WHERE TO GO NEXT
213
2ca930b4 214L<DBIx::Class::Manual::DocMap> lists each task you might want help on, and
215the modules where you will find documentation.
076652e8 216
3942ab4d 217=head1 AUTHOR
34d52be2 218
266bdcc3 219mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
34d52be2 220
dfccde48 221(I mostly consider myself "project founder" these days but the AUTHOR heading
222is traditional :)
223
3942ab4d 224=head1 CONTRIBUTORS
225
907ed671 226abraxxa: Alexander Hartmaier <abraxxa@cpan.org>
84e3c114 227
6d84db2c 228aherzog: Adam Herzog <adam@herzogdesigns.com>
229
daeb1865 230Alexander Keusch <cpan@keusch.at>
231
6ebf5cbb 232amiri: Amiri Barksdale <amiri@metalabel.com>
233
b703fec7 234amoore: Andrew Moore <amoore@cpan.org>
235
266bdcc3 236andyg: Andy Grundman <andy@hybridized.org>
3942ab4d 237
266bdcc3 238ank: Andres Kievsky
3942ab4d 239
624764ae 240arcanez: Justin Hunter <justin.d.hunter@gmail.com>
241
ce4c07df 242ash: Ash Berlin <ash@cpan.org>
243
3d5bd2af 244bert: Norbert Csongradi <bert@cpan.org>
245
967a4c40 246blblack: Brandon L. Black <blblack@gmail.com>
3942ab4d 247
62eb8fe8 248bluefeet: Aran Deltac <bluefeet@cpan.org>
249
f856fe01 250boghead: Bryan Beeley <cpan@beeley.org>
251
bcb8f3ed 252bricas: Brian Cassidy <bricas@cpan.org>
253
3d7e3e05 254brunov: Bruno Vecchi <vecchi.b@gmail.com>
255
281719d2 256caelum: Rafael Kitover <rkitover@cpan.org>
257
d3b0e369 258castaway: Jess Robinson
3942ab4d 259
266bdcc3 260claco: Christopher H. Laco
ccb9c9b1 261
266bdcc3 262clkao: CL Kao
3942ab4d 263
e21dfd6a 264da5id: David Jack Olrik <djo@cpan.org>
18360aed 265
13de943d 266debolaz: Anders Nor Berle <berle@cpan.org>
267
d1f542db 268dew: Dan Thomas <dan@godders.org>
269
266bdcc3 270dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com>
ccb9c9b1 271
9382ad07 272dnm: Justin Wheeler <jwheeler@datademons.com>
273
0818c9a7 274dpetrov: Dimitar Petrov <mitakaa@gmail.com>
275
266bdcc3 276dwc: Daniel Westermann-Clark <danieltwc@cpan.org>
4685e006 277
5cffe785 278dyfrgi: Michael Leuchtenburg <michael@slashhome.org>
8fe164b9 279
ade0fe3b 280frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com>
281
b4987ed0 282goraxe: Gordon Irving <goraxe@cpan.org>
283
d3b0e369 284gphat: Cory G Watson <gphat@cpan.org>
ad3d2d7c 285
e758ffe6 286groditi: Guillermo Roditi <groditi@cpan.org>
287
6dad89f5 288Haarg: Graham Knop <haarg@haarg.org>
289
157ce0cf 290hobbs: Andrew Rodland <arodland@cpan.org>
291
5d779578 292ilmari: Dagfinn Ilmari MannsE<aring>ker <ilmari@ilmari.org>
293
bee21976 294jasonmay: Jason May <jason.a.may@gmail.com>
295
d3b0e369 296jesper: Jesper Krogh
5fb0c64c 297
4a743a00 298jgoulah: John Goulah <jgoulah@cpan.org>
299
102a2984 300jguenther: Justin Guenther <jguenther@cpan.org>
d7c4c15c 301
a14a46e2 302jhannah: Jay Hannah <jay@jays.net>
303
8b93a938 304jnapiorkowski: John Napiorkowski <jjn1056@yahoo.com>
305
11736b4c 306jon: Jon Schutz <jjschutz@cpan.org>
307
1aec4bac 308jshirley: J. Shirley <jshirley@gmail.com>
309
d3b0e369 310konobi: Scott McWhirter
535fc2ee 311
4367679a 312lukes: Luke Saunders <luke.saunders@gmail.com>
313
709ea492 314marcus: Marcus Ramberg <mramberg@cpan.org>
315
114780ee 316mattlaw: Matt Lawrence
317
58755bba 318michaelr: Michael Reddick <michael.reddick@gmail.com>
319
77e7e47d 320ned: Neil de Carteret
321
266bdcc3 322nigel: Nigel Metheringham <nigelm@cpan.org>
6565b410 323
d3b0e369 324ningu: David Kamholz <dkamholz@cpan.org>
325
66cf3a84 326Nniuq: Ron "Quinn" Straight" <quinnfazigu@gmail.org>
327
20b4c148 328norbi: Norbert Buchmuller <norbi@nix.hu>
329
48580715 330nuba: Nuba Princigalli <nuba@cpan.org>
331
d3b0e369 332Numa: Dan Sully <daniel@cpan.org>
333
dc571b76 334ovid: Curtis "Ovid" Poe <ovid@cpan.org>
335
bf356c54 336oyse: Øystein Torget <oystein.torget@dnv.com>
337
266bdcc3 338paulm: Paul Makepeace
4763f4b7 339
d3b0e369 340penguin: K J Cheetham
341
8cfef6f5 342perigrin: Chris Prather <chris@prather.org>
343
14899528 344peter: Peter Collingbourne <peter@pcc.me.uk>
caac1708 345
266bdcc3 346phaylon: Robert Sedlacek <phaylon@dunkelheit.at>
a53b95f1 347
56fadd8f 348plu: Johannes Plunien <plu@cpan.org>
349
0c1a4a15 350Possum: Daniel LeWarne <possum@cpan.org>
351
d3b0e369 352quicksilver: Jules Bean
022e0893 353
4ed01b34 354rafl: Florian Ragwitz <rafl@debian.org>
355
0c1a4a15 356rainboxx: Matthias Dietrich <perl@rb.ly>
357
868a7b26 358rbo: Robert Bohne <rbo@cpan.org>
359
7ff0dace 360rbuels: Robert Buels <rmb32@cornell.edu>
361
0da8b7da 362rdj: Ryan D Johnson <ryan@innerfence.com>
363
66b1e361 364ribasushi: Peter Rabbitson <ribasushi@cpan.org>
d76e282a 365
b487918c 366rjbs: Ricardo Signes <rjbs@cpan.org>
367
6ffb5be5 368robkinyon: Rob Kinyon <rkinyon@cpan.org>
369
e4c9f3f0 370Roman: Roman Filippov <romanf@cpan.org>
371
d3b0e369 372sc_: Just Another Perl Hacker
ba606e58 373
266bdcc3 374scotty: Scotty Allen <scotty@scottyallen.com>
181a28f4 375
1c133e22 376semifor: Marc Mims <marc@questright.com>
377
20b4c148 378solomon: Jared Johnson <jaredj@nmgi.com>
379
88f937fb 380spb: Stephen Bennett <stephen@freenode.net>
381
637ca936 382sszabo: Stephan Szabo <sszabo@bigpanda.com>
383
386c2272 384teejay : Aaron Trevena <teejay@cpan.org>
385
84e3c114 386Todd Lipcon
e063fe2c 387
6eb6264e 388Tom Hukins
389
2e4b6d78 390tonvoon: Ton Voon <tonvoon@cpan.org>
391
d15e3fc5 392triode: Pete Gamache <gamache@cpan.org>
393
d3b0e369 394typester: Daisuke Murase <typester@cpan.org>
c0e7b4e5 395
4740bdb7 396victori: Victor Igumnov <victori@cpan.org>
397
d3b0e369 398wdh: Will Hawes
4c248161 399
00c03ced 400willert: Sebastian Willert <willert@cpan.org>
401
66d2a14e 402wreis: Wallace Reis <wreis@cpan.org>
403
d3b0e369 404zamolxes: Bogdan Lucaciu <bogdan@wiz.ro>
78060df8 405
b38e10bd 406=head1 COPYRIGHT
407
48580715 408Copyright (c) 2005 - 2010 the DBIx::Class L</AUTHOR> and L</CONTRIBUTORS>
b38e10bd 409as listed above.
410
96154ef7 411=head1 LICENSE
412
413This library is free software and may be distributed under the same terms
414as perl itself.
415
34d52be2 416=cut