Minor consistency, layout and grammar updates
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Manual / Cookbook.pod
1 =head1 NAME 
2
3 DBIx::Class::Manual::Cookbook - Miscellaneous recipes
4
5 =head1 RECIPES
6
7 =head2 Searching
8
9 =head3 Paged results
10
11 When you expect a large number of results, you can ask L<DBIx::Class> for a
12 paged resultset, which will fetch only a small number of records at a time:
13
14   my $rs = $schema->resultset('Artist')->search(
15     undef,
16     {
17       page => 1,  # page to return (defaults to 1)
18       rows => 10, # number of results per page
19     },
20   );
21
22   return $rs->all(); # all records for page 1
23
24 The C<page> attribute does not have to be specified in your search:
25
26   my $rs = $schema->resultset('Artist')->search(
27     undef,
28     {
29       rows => 10,
30     }
31   );
32
33   return $rs->page(1); # DBIx::Class::ResultSet containing first 10 records
34
35 In either of the above cases, you can return a L<Data::Page> object for the
36 resultset (suitable for use in e.g. a template) using the C<pager> method:
37
38   return $rs->pager();
39
40 =head3 Complex WHERE clauses
41
42 Sometimes you need to formulate a query using specific operators:
43
44   my @albums = $schema->resultset('Album')->search({
45     artist => { 'like', '%Lamb%' },
46     title  => { 'like', '%Fear of Fours%' },
47   });
48
49 This results in something like the following C<WHERE> clause:
50
51   WHERE artist LIKE '%Lamb%' AND title LIKE '%Fear of Fours%'
52
53 Other queries might require slightly more complex logic:
54
55   my @albums = $schema->resultset('Album')->search({
56     -or => [
57       -and => [
58         artist => { 'like', '%Smashing Pumpkins%' },
59         title  => 'Siamese Dream',
60       ],
61       artist => 'Starchildren',
62     ],
63   });
64
65 This results in the following C<WHERE> clause:
66
67   WHERE ( artist LIKE '%Smashing Pumpkins%' AND title = 'Siamese Dream' )
68     OR artist = 'Starchildren'
69
70 For more information on generating complex queries, see
71 L<SQL::Abstract/WHERE CLAUSES>.
72
73 =head3 Using specific columns
74
75 When you only want specific columns from a table, you can use
76 C<columns> to specify which ones you need. This is useful to avoid
77 loading columns with large amounts of data that you aren't about to
78 use anyway:
79
80   my $rs = $schema->resultset('Artist')->search(
81     undef,
82     {
83       columns => [qw/ name /]
84     }
85   );
86
87   # Equivalent SQL:
88   # SELECT artist.name FROM artist
89
90 This is a shortcut for C<select> and C<as>, see below. C<columns>
91 cannot be used together with C<select> and C<as>.
92
93 =head3 Using database functions or stored procedures
94
95 The combination of C<select> and C<as> can be used to return the result of a
96 database function or stored procedure as a column value. You use C<select> to
97 specify the source for your column value (e.g. a column name, function, or
98 stored procedure name). You then use C<as> to set the column name you will use
99 to access the returned value:
100
101   my $rs = $schema->resultset('Artist')->search(
102     {},
103     {
104       select => [ 'name', { LENGTH => 'name' } ],
105       as     => [qw/ name name_length /],
106     }
107   );
108
109   # Equivalent SQL:
110   # SELECT name name, LENGTH( name ) name_length
111   # FROM artist
112
113 If your alias exists as a column in your base class (i.e. it was added
114 with C<add_columns>), you just access it as normal. Our C<Artist>
115 class has a C<name> column, so we just use the C<name> accessor:
116
117   my $artist = $rs->first();
118   my $name = $artist->name();
119
120 If on the other hand the alias does not correspond to an existing column, you
121 have to fetch the value using the C<get_column> accessor:
122
123   my $name_length = $artist->get_column('name_length');
124
125 If you don't like using C<get_column>, you can always create an accessor for
126 any of your aliases using either of these:
127
128   # Define accessor manually:
129   sub name_length { shift->get_column('name_length'); }
130     
131   # Or use DBIx::Class::AccessorGroup:
132   __PACKAGE__->mk_group_accessors('column' => 'name_length');
133
134 =head3 SELECT DISTINCT with multiple columns
135
136   my $rs = $schema->resultset('Foo')->search(
137     {},
138     {
139       select => [
140         { distinct => [ $source->columns ] }
141       ],
142       as => [ $source->columns ]
143     }
144   );
145
146   my $count = $rs->next->get_column('count');
147
148 =head3 SELECT COUNT(DISTINCT colname)
149
150   my $rs = $schema->resultset('Foo')->search(
151     {},
152     {
153       select => [
154         { count => { distinct => 'colname' } }
155       ],
156       as => [ 'count' ]
157     }
158   );
159
160 =head3 Grouping results
161
162 L<DBIx::Class> supports C<GROUP BY> as follows:
163
164   my $rs = $schema->resultset('Artist')->search(
165     {},
166     {
167       join     => [qw/ cds /],
168       select   => [ 'name', { count => 'cds.cdid' } ],
169       as       => [qw/ name cd_count /],
170       group_by => [qw/ name /]
171     }
172   );
173
174   # Equivalent SQL:
175   # SELECT name, COUNT( cds.cdid ) FROM artist me
176   # LEFT JOIN cd cds ON ( cds.artist = me.artistid )
177   # GROUP BY name
178
179 =head3 Predefined searches
180
181 You can write your own L<DBIx::Class::ResultSet> class by inheriting from it
182 and define often used searches as methods:
183
184   package My::DBIC::ResultSet::CD;
185   use strict;
186   use warnings;
187   use base 'DBIx::Class::ResultSet';
188
189   sub search_cds_ordered {
190       my ($self) = @_;
191
192       return $self->search(
193           {},
194           { order_by => 'name DESC' },
195       );
196   }
197
198   1;
199
200 To use your resultset, first tell DBIx::Class to create an instance of it
201 for you, in your My::DBIC::Schema::CD class:
202
203   __PACKAGE__->resultset_class('My::DBIC::ResultSet::CD');
204
205 Then call your new method in your code:
206
207    my $ordered_cds = $schema->resultset('CD')->search_cds_ordered();
208
209
210 =head3 Predefined searches without writing a ResultSet class
211
212 Alternatively you can automatically generate a DBIx::Class::ResultSet
213 class by using the ResultSetManager component and tagging your method
214 as ResultSet:
215
216   __PACKAGE__->load_components(qw/ ResultSetManager Core /);
217
218   sub search_cds_ordered : ResultSet {
219       my ($self) = @_;
220       return $self->search(
221           {},
222           { order_by => 'name DESC' },
223       );
224   } 
225
226 Then call your method in the same way from your code:
227
228    my $ordered_cds = $schema->resultset('CD')->search_cds_ordered();
229
230 =head2 Using joins and prefetch
231
232 You can use the C<join> attribute to allow searching on, or sorting your
233 results by, one or more columns in a related table. To return all CDs matching
234 a particular artist name:
235
236   my $rs = $schema->resultset('CD')->search(
237     {
238       'artist.name' => 'Bob Marley'    
239     },
240     {
241       join => [qw/artist/], # join the artist table
242     }
243   );
244
245   # Equivalent SQL:
246   # SELECT cd.* FROM cd
247   # JOIN artist ON cd.artist = artist.id
248   # WHERE artist.name = 'Bob Marley'
249
250 If required, you can now sort on any column in the related tables by including
251 it in your C<order_by> attribute:
252
253   my $rs = $schema->resultset('CD')->search(
254     {
255       'artist.name' => 'Bob Marley'
256     },
257     {
258       join     => [qw/ artist /],
259       order_by => [qw/ artist.name /]
260     }
261   };
262
263   # Equivalent SQL:
264   # SELECT cd.* FROM cd
265   # JOIN artist ON cd.artist = artist.id
266   # WHERE artist.name = 'Bob Marley'
267   # ORDER BY artist.name
268
269 Note that the C<join> attribute should only be used when you need to search or
270 sort using columns in a related table. Joining related tables when you only
271 need columns from the main table will make performance worse!
272
273 Now let's say you want to display a list of CDs, each with the name of the
274 artist. The following will work fine:
275
276   while (my $cd = $rs->next) {
277     print "CD: " . $cd->title . ", Artist: " . $cd->artist->name;
278   }
279
280 There is a problem however. We have searched both the C<cd> and C<artist> tables
281 in our main query, but we have only returned data from the C<cd> table. To get
282 the artist name for any of the CD objects returned, L<DBIx::Class> will go back
283 to the database:
284
285   SELECT artist.* FROM artist WHERE artist.id = ?
286
287 A statement like the one above will run for each and every CD returned by our
288 main query. Five CDs, five extra queries. A hundred CDs, one hundred extra
289 queries!
290
291 Thankfully, L<DBIx::Class> has a C<prefetch> attribute to solve this problem.
292 This allows you to fetch results from related tables in advance:
293
294   my $rs = $schema->resultset('CD')->search(
295     {
296       'artist.name' => 'Bob Marley'
297     },
298     {
299       join     => [qw/ artist /],
300       order_by => [qw/ artist.name /],
301       prefetch => [qw/ artist /] # return artist data too!
302     }
303   );
304
305   # Equivalent SQL (note SELECT from both "cd" and "artist"):
306   # SELECT cd.*, artist.* FROM cd
307   # JOIN artist ON cd.artist = artist.id
308   # WHERE artist.name = 'Bob Marley'
309   # ORDER BY artist.name
310
311 The code to print the CD list remains the same:
312
313   while (my $cd = $rs->next) {
314     print "CD: " . $cd->title . ", Artist: " . $cd->artist->name;
315   }
316
317 L<DBIx::Class> has now prefetched all matching data from the C<artist> table,
318 so no additional SQL statements are executed. You now have a much more
319 efficient query.
320
321 Note that as of L<DBIx::Class> 0.05999_01, C<prefetch> I<can> be used with
322 C<has_many> relationships.
323
324 Also note that C<prefetch> should only be used when you know you will
325 definitely use data from a related table. Pre-fetching related tables when you
326 only need columns from the main table will make performance worse!
327
328 =head3 Multi-step joins
329
330 Sometimes you want to join more than one relationship deep. In this example,
331 we want to find all C<Artist> objects who have C<CD>s whose C<LinerNotes>
332 contain a specific string:
333
334   # Relationships defined elsewhere:
335   # Artist->has_many('cds' => 'CD', 'artist');
336   # CD->has_one('liner_notes' => 'LinerNotes', 'cd');
337
338   my $rs = $schema->resultset('Artist')->search(
339     {
340       'liner_notes.notes' => { 'like', '%some text%' },
341     },
342     {
343       join => {
344         'cds' => 'liner_notes'
345       }
346     }
347   );
348
349   # Equivalent SQL:
350   # SELECT artist.* FROM artist
351   # JOIN ( cd ON artist.id = cd.artist )
352   # JOIN ( liner_notes ON cd.id = liner_notes.cd )
353   # WHERE liner_notes.notes LIKE '%some text%'
354
355 Joins can be nested to an arbitrary level. So if we decide later that we
356 want to reduce the number of Artists returned based on who wrote the liner
357 notes:
358
359   # Relationship defined elsewhere:
360   # LinerNotes->belongs_to('author' => 'Person');
361
362   my $rs = $schema->resultset('Artist')->search(
363     {
364       'liner_notes.notes' => { 'like', '%some text%' },
365       'author.name' => 'A. Writer'
366     },
367     {
368       join => {
369         'cds' => {
370           'liner_notes' => 'author'
371         }
372       }
373     }
374   );
375
376   # Equivalent SQL:
377   # SELECT artist.* FROM artist
378   # JOIN ( cd ON artist.id = cd.artist )
379   # JOIN ( liner_notes ON cd.id = liner_notes.cd )
380   # JOIN ( author ON author.id = liner_notes.author )
381   # WHERE liner_notes.notes LIKE '%some text%'
382   # AND author.name = 'A. Writer'
383
384 =head2 Multi-step prefetch
385
386 From 0.04999_05 onwards, C<prefetch> can be nested more than one relationship
387 deep using the same syntax as a multi-step join:
388
389   my $rs = $schema->resultset('Tag')->search(
390     undef,
391     {
392       prefetch => {
393         cd => 'artist'
394       }
395     }
396   );
397
398   # Equivalent SQL:
399   # SELECT tag.*, cd.*, artist.* FROM tag
400   # JOIN cd ON tag.cd = cd.cdid
401   # JOIN artist ON cd.artist = artist.artistid
402
403 Now accessing our C<cd> and C<artist> relationships does not need additional
404 SQL statements:
405
406   my $tag = $rs->first;
407   print $tag->cd->artist->name;
408
409 =head2 Using relationships
410
411 =head3 Create a new row in a related table
412
413   my $book->create_related('author', { name => 'Fred'});
414
415 =head3 Search in a related table
416
417 Only searches for books named 'Titanic' by the author in $author.
418
419   my $author->search_related('books', { name => 'Titanic' });
420
421 =head3 Delete data in a related table
422
423 Deletes only the book named Titanic by the author in $author.
424
425   my $author->delete_related('books', { name => 'Titanic' });
426
427 =head3 Ordering a relationship result set
428
429 If you always want a relation to be ordered, you can specify this when you 
430 create the relationship.
431
432 To order C<< $book->pages >> by descending page_number.
433
434   Book->has_many('pages' => 'Page', 'book', { order_by => \'page_number DESC'} );
435
436
437
438 =head2 Transactions
439
440 As of version 0.04001, there is improved transaction support in
441 L<DBIx::Class::Storage::DBI> and L<DBIx::Class::Schema>.  Here is an
442 example of the recommended way to use it:
443
444   my $genus = $schema->resultset('Genus')->find(12);
445
446   my $coderef2 = sub {
447     $genus->extinct(1);
448     $genus->update;
449   };
450
451   my $coderef1 = sub {
452     $genus->add_to_species({ name => 'troglodyte' });
453     $genus->wings(2);
454     $genus->update;
455     $schema->txn_do($coderef2); # Can have a nested transaction
456     return $genus->species;
457   };
458
459   my $rs;
460   eval {
461     $rs = $schema->txn_do($coderef1);
462   };
463
464   if ($@) {                             # Transaction failed
465     die "the sky is falling!"           #
466       if ($@ =~ /Rollback failed/);     # Rollback failed
467
468     deal_with_failed_transaction();
469   }
470
471 Nested transactions will work as expected. That is, only the outermost
472 transaction will actually issue a commit to the $dbh, and a rollback
473 at any level of any transaction will cause the entire nested
474 transaction to fail. Support for savepoints and for true nested
475 transactions (for databases that support them) will hopefully be added
476 in the future.
477
478 =head2 Many-to-many relationships
479
480 This is straightforward using L<DBIx::Class::Relationship::ManyToMany>:
481
482   package My::DB;
483   # ... set up connection ...
484
485   package My::User;
486   use base 'My::DB';
487   __PACKAGE__->table('user');
488   __PACKAGE__->add_columns(qw/id name/);
489   __PACKAGE__->set_primary_key('id');
490   __PACKAGE__->has_many('user_address' => 'My::UserAddress', 'user');
491   __PACKAGE__->many_to_many('addresses' => 'user_address', 'address');
492
493   package My::UserAddress;
494   use base 'My::DB';
495   __PACKAGE__->table('user_address');
496   __PACKAGE__->add_columns(qw/user address/);
497   __PACKAGE__->set_primary_key(qw/user address/);
498   __PACKAGE__->belongs_to('user' => 'My::User');
499   __PACKAGE__->belongs_to('address' => 'My::Address');
500
501   package My::Address;
502   use base 'My::DB';
503   __PACKAGE__->table('address');
504   __PACKAGE__->add_columns(qw/id street town area_code country/);
505   __PACKAGE__->set_primary_key('id');
506   __PACKAGE__->has_many('user_address' => 'My::UserAddress', 'address');
507   __PACKAGE__->many_to_many('users' => 'user_address', 'user');
508
509   $rs = $user->addresses(); # get all addresses for a user
510   $rs = $address->users(); # get all users for an address
511
512 =head2 Setting default values for a row
513
514 It's as simple as overriding the C<new> method.  Note the use of
515 C<next::method>.
516
517   sub new {
518     my ( $class, $attrs ) = @_;
519
520     $attrs->{foo} = 'bar' unless defined $attrs->{foo};
521
522     $class->next::method($attrs);
523   }
524
525 For more information about C<next::method>, look in the L<Class::C3> 
526 documentation. See also L<DBIx::Class::Manual::Component> for more
527 ways to write your own base classes to do this.
528
529 People looking for ways to do "triggers" with DBIx::Class are probably
530 just looking for this.
531
532 =head2 Stringification
533
534 Employ the standard stringification technique by using the C<overload>
535 module.
536
537 To make an object stringify itself as a single column, use something
538 like this (replace C<foo> with the column/method of your choice):
539
540   use overload '""' => 'foo', fallback => 1;
541
542 For more complex stringification, you can use an anonymous subroutine:
543
544   use overload '""' => sub { $_[0]->name . ", " .
545                              $_[0]->address }, fallback => 1;
546
547 =head3 Stringification Example
548
549 Suppose we have two tables: C<Product> and C<Category>. The table
550 specifications are:
551
552   Product(id, Description, category)
553   Category(id, Description)
554
555 C<category> is a foreign key into the Category table.
556
557 If you have a Product object C<$obj> and write something like
558
559   print $obj->category
560
561 things will not work as expected.
562
563 To obtain, for example, the category description, you should add this
564 method to the class defining the Category table:
565
566   use overload "" => sub {
567       my $self = shift;
568
569       return $self->Description;
570   }, fallback => 1;
571
572 =head2 Disconnecting cleanly
573
574 If you find yourself quitting an app with Control-C a lot during
575 development, you might like to put the following signal handler in
576 your main database class to make sure it disconnects cleanly:
577
578   $SIG{INT} = sub {
579     __PACKAGE__->storage->disconnect;
580   };
581
582 =head2 Schema import/export
583
584 This functionality requires you to have L<SQL::Translator> (also known as
585 "SQL Fairy") installed.
586
587 To create a DBIx::Class schema from an existing database:
588
589  sqlt --from DBI
590       --to DBIx::Class::File
591       --prefix "MySchema" > MySchema.pm
592
593 To create a MySQL database from an existing L<DBIx::Class> schema, convert the
594 schema to MySQL's dialect of SQL:
595
596   sqlt --from SQL::Translator::Parser::DBIx::Class 
597        --to MySQL 
598        --DBIx::Class "MySchema.pm" > Schema1.sql
599   
600 And import using the mysql client:
601
602   mysql -h "host" -D "database" -u "user" -p < Schema1.sql
603
604 =head2 Easy migration from class-based to schema-based setup
605
606 You want to start using the schema-based approach to L<DBIx::Class>
607 (see L<SchemaIntro.pod>), but have an established class-based setup with lots
608 of existing classes that you don't want to move by hand. Try this nifty script
609 instead:
610
611   use MyDB;
612   use SQL::Translator;
613   
614   my $schema = MyDB->schema_instance;
615   
616   my $translator           =  SQL::Translator->new( 
617       debug                => $debug          ||  0,
618       trace                => $trace          ||  0,
619       no_comments          => $no_comments    ||  0,
620       show_warnings        => $show_warnings  ||  0,
621       add_drop_table       => $add_drop_table ||  0,
622       validate             => $validate       ||  0,
623       parser_args          => {
624          'DBIx::Schema'    => $schema,
625                               },
626       producer_args   => {
627           'prefix'         => 'My::Schema',
628                          },
629   );
630   
631   $translator->parser('SQL::Translator::Parser::DBIx::Class');
632   $translator->producer('SQL::Translator::Producer::DBIx::Class::File');
633   
634   my $output = $translator->translate(@args) or die
635           "Error: " . $translator->error;
636   
637   print $output;
638
639 You could use L<Module::Find> to search for all subclasses in the MyDB::*
640 namespace, which is currently left as an exercise for the reader.
641
642 =head2 Schema versioning
643
644 The following example shows simplistically how you might use DBIx::Class to
645 deploy versioned schemas to your customers. The basic process is as follows:
646
647 =over 4
648
649 =item 1.
650
651 Create a DBIx::Class schema
652
653 =item 2.
654
655 Save the schema
656
657 =item 3.
658
659 Deploy to customers
660
661 =item 4.
662
663 Modify schema to change functionality
664
665 =item 5.
666
667 Deploy update to customers
668
669 =back
670
671 =head3 Create a DBIx::Class schema
672
673 This can either be done manually, or generated from an existing database as
674 described under C<Schema import/export>.
675
676 =head3 Save the schema
677
678 Use C<sqlt> to transform your schema into an SQL script suitable for your
679 customer's database. E.g. for MySQL:
680
681   sqlt --from SQL::Translator::Parser::DBIx::Class
682        --to MySQL
683        --DBIx::Class "MySchema.pm" > Schema1.mysql.sql
684
685 If you need to target databases from multiple vendors, just generate an SQL
686 script suitable for each. To support PostgreSQL too:
687
688   sqlt --from SQL::Translator::DBIx::Class
689        --to PostgreSQL
690        --DBIx::Class "MySchema.pm" > Schema1.pgsql.sql
691
692 =head3 Deploy to customers
693
694 There are several ways you could deploy your schema. These are probably
695 beyond the scope of this recipe, but might include:
696
697 =over 4
698
699 =item 1.
700
701 Require customer to apply manually using their RDBMS.
702
703 =item 2.
704
705 Package along with your app, making database dump/schema update/tests
706 all part of your install.
707
708 =back
709
710 =head3 Modify the schema to change functionality
711
712 As your application evolves, it may be necessary to modify your schema to
713 change functionality. Once the changes are made to your schema in DBIx::Class,
714 export the modified schema as before, taking care not to overwrite the original:
715
716   sqlt --from SQL::Translator::DBIx::Class
717        --to MySQL
718        --DBIx::Class "Anything.pm" > Schema2.mysql.sql
719
720 Next, use sqlt-diff to create an SQL script that will update the customer's
721 database schema:
722
723   sqlt-diff --to MySQL Schema1=MySQL Schema2=MySQL > SchemaUpdate.mysql.sql
724
725 =head3 Deploy update to customers
726
727 The schema update can be deployed to customers using the same method as before.
728
729 =head2 Setting limit dialect for SQL::Abstract::Limit
730
731 In some cases, SQL::Abstract::Limit cannot determine the dialect of
732 the remote SQL server by looking at the database handle. This is a
733 common problem when using the DBD::JDBC, since the DBD-driver only
734 know that in has a Java-driver available, not which JDBC driver the
735 Java component has loaded.  This specifically sets the limit_dialect
736 to Microsoft SQL-server (See more names in SQL::Abstract::Limit
737 -documentation.
738
739   __PACKAGE__->storage->sql_maker->limit_dialect('mssql');
740
741 The JDBC bridge is one way of getting access to a MSSQL server from a platform
742 that Microsoft doesn't deliver native client libraries for. (e.g. Linux)
743
744 =head2 Setting quoting for the generated SQL. 
745
746 If the database contains column names with spaces and/or reserved words, they
747 need to be quoted in the SQL queries. This is done using:
748
749   __PACKAGE__->storage->sql_maker->quote_char([ qw/[ ]/] );
750   __PACKAGE__->storage->sql_maker->name_sep('.');
751
752 The first sets the quote characters. Either a pair of matching
753 brackets, or a C<"> or C<'>:
754   
755   __PACKAGE__->storage->sql_maker->quote_char('"');
756
757 Check the documentation of your database for the correct quote
758 characters to use. C<name_sep> needs to be set to allow the SQL
759 generator to put the quotes the correct place.
760
761 =head2 Overloading methods
762
763 L<DBIx::Class> uses the L<Class::C3> package, which provides for redispatch of 
764 method calls.  You have to use calls to C<next::method> to overload methods.  
765 More information on using L<Class::C3> with L<DBIx::Class> can be found in 
766 L<DBIx::Class::Manual::Component>.
767
768 =head3 Changing one field whenever another changes
769
770 For example, say that you have three columns, C<id>, C<number>, and 
771 C<squared>.  You would like to make changes to C<number> and have
772 C<squared> be automagically set to the value of C<number> squared.
773 You can accomplish this by overriding C<store_column>:
774
775   sub store_column {
776     my ( $self, $name, $value ) = @_;
777     if ($name eq 'number') {
778       $self->squared($value * $value);
779     }
780     $self->next::method($name, $value);
781   }
782
783 Note that the hard work is done by the call to C<next::method>, which
784 redispatches your call to store_column in the superclass(es).
785
786 =head3 Automatically creating related objects
787
788 You might have a class C<Artist> which has many C<CD>s.  Further, if you
789 want to create a C<CD> object every time you insert an C<Artist> object.
790 You can accomplish this by overriding C<insert> on your objects:
791
792   sub insert {
793     my ( $self, @args ) = @_;
794     $self->next::method(@args);
795     $self->cds->new({})->fill_from_artist($self)->insert;
796     return $self;
797   }
798
799 where C<fill_from_artist> is a method you specify in C<CD> which sets
800 values in C<CD> based on the data in the C<Artist> object you pass in.
801
802 =head2 Debugging DBIx::Class objects with Data::Dumper
803
804 L<Data::Dumper> can be a very useful tool for debugging, but sometimes it can
805 be hard to find the pertinent data in all the data it can generate.
806 Specifically, if one naively tries to use it like so,
807
808   use Data::Dumper;
809
810   my $cd = $schema->resultset('CD')->find(1);
811   print Dumper($cd);
812
813 several pages worth of data from the CD object's schema and result source will
814 be dumped to the screen. Since usually one is only interested in a few column
815 values of the object, this is not very helpful.
816
817 Luckily, it is possible to modify the data before L<Data::Dumper> outputs
818 it. Simply define a hook that L<Data::Dumper> will call on the object before
819 dumping it. For example,
820
821   package My::DB::CD;
822
823   sub _dumper_hook {
824     $_[0] = bless {
825       %{ $_[0] },
826       result_source => undef,
827     }, ref($_[0]);
828   }
829
830   [...]
831
832   use Data::Dumper;
833
834   local $Data::Dumper::Freezer = '_dumper_hook';
835
836   my $cd = $schema->resultset('CD')->find(1);
837   print Dumper($cd);
838          # dumps $cd without its ResultSource
839
840 If the structure of your schema is such that there is a common base class for
841 all your table classes, simply put a method similar to C<_dumper_hook> in the
842 base class and set C<$Data::Dumper::Freezer> to its name and L<Data::Dumper>
843 will automagically clean up your data before printing it. See
844 L<Data::Dumper/EXAMPLES> for more information.
845
846 =head2 Retrieving a row object's Schema
847
848 It is possible to get a Schema object from a row object like so:
849
850   my $schema = $cd->result_source->schema;
851   # use the schema as normal:
852   my $artist_rs = $schema->resultset('Artist'); 
853
854 This can be useful when you don't want to pass around a Schema object to every
855 method.
856
857 =head2 Profiling
858
859 When you enable L<DBIx::Class::Storage::DBI>'s debugging it prints the SQL
860 executed as well as notifications of query completion and transaction
861 begin/commit.  If you'd like to profile the SQL you can subclass the
862 L<DBIx::Class::Storage::Statistics> class and write your own profiling
863 mechanism:
864
865   package My::Profiler;
866   use strict;
867
868   use base 'DBIx::Class::Storage::Statistics';
869
870   use Time::HiRes qw(time);
871
872   my $start;
873
874   sub query_start {
875     my $self = shift();
876     my $sql = shift();
877     my $params = @_;
878
879     print "Executing $sql: ".join(', ', @params)."\n";
880     $start = time();
881   }
882
883   sub query_end {
884     my $self = shift();
885     my $sql = shift();
886     my @params = @_;
887
888     printf("Execution took %0.4f seconds.\n", time() - $start);
889     $start = undef;
890   }
891
892   1;
893
894 You can then install that class as the debugging object:
895
896   __PACKAGE__->storage()->debugobj(new My::Profiler());
897   __PACKAGE__->storage()->debug(1);
898
899 A more complicated example might involve storing each execution of SQL in an
900 array:
901
902   sub query_end {
903     my $self = shift();
904     my $sql = shift();
905     my @params = @_;
906
907     my $elapsed = time() - $start;
908     push(@{ $calls{$sql} }, {
909         params => \@params,
910         elapsed => $elapsed
911     });
912   }
913
914 You could then create average, high and low execution times for an SQL
915 statement and dig down to see if certain parameters cause aberrant behavior.
916
917 =head2 Getting the value of the primary key for the last database insert
918
919 AKA getting last_insert_id
920
921 If you are using PK::Auto, this is straightforward:
922
923   my $foo = $rs->create(\%blah);
924   # do more stuff
925   my $id = $foo->id; # foo->my_primary_key_field will also work.
926
927 If you are not using autoincrementing primary keys, this will probably
928 not work, but then you already know the value of the last primary key anyway.
929
930 =head2 Dynamic Sub-classing DBIx::Class proxy classes 
931 (AKA multi-class object inflation from one table) 
932  
933 L<DBIx::Class> classes are proxy classes, therefore some different
934 techniques need to be employed for more than basic subclassing.  In
935 this example we have a single user table that carries a boolean bit
936 for admin.  We would like like to give the admin users
937 objects(L<DBIx::Class::Row>) the same methods as a regular user but
938 also special admin only methods.  It doesn't make sense to create two
939 seperate proxy-class files for this.  We would be copying all the user
940 methods into the Admin class.  There is a cleaner way to accomplish
941 this.
942
943 Overriding the C<inflate_results()> method within the User proxy-class
944 gives us the effect we want.  This method is called by
945 L<DBIx::Class::ResultSet> when inflating a result from storage.  So we
946 grab the object being returned, inspect the values we are looking for,
947 bless it if it's an admin object, and then return it.  See the example
948 below:
949  
950 B<Schema Definition> 
951  
952     package DB::Schema; 
953      
954     use base qw/DBIx::Class::Schema/; 
955  
956     __PACKAGE__->load_classes(qw/User/); 
957  
958  
959 B<Proxy-Class definitions> 
960  
961     package DB::Schema::User; 
962      
963     use strict; 
964     use warnings; 
965     use base qw/DBIx::Class/; 
966      
967     ### Defined what our admin class is for ensure_class_loaded 
968     my $admin_class = __PACKAGE__ . '::Admin'; 
969      
970     __PACKAGE__->load_components(qw/Core/); 
971      
972     __PACKAGE__->table('users'); 
973      
974     __PACKAGE__->add_columns(qw/user_id   email    password  
975                                 firstname lastname active 
976                                 admin/); 
977      
978     __PACKAGE__->set_primary_key('user_id'); 
979      
980     sub inflate_result { 
981         my $self = shift;  
982         my $ret = $self->next::method(@_); 
983         if( $ret->admin ) {### If this is an admin rebless for extra functions  
984             $self->ensure_class_loaded( $admin_class ); 
985             bless $ret, $admin_class; 
986         } 
987         return $ret; 
988     } 
989      
990     sub hello { 
991         print "I am a regular user.\n"; 
992         return ; 
993     } 
994      
995      
996     package DB::Schema::User::Admin; 
997      
998     use strict; 
999     use warnings; 
1000     use base qw/DB::Schema::User/; 
1001      
1002     sub hello 
1003     { 
1004         print "I am an admin.\n"; 
1005         return; 
1006     } 
1007      
1008     sub do_admin_stuff 
1009     { 
1010         print "I am doing admin stuff\n"; 
1011         return ; 
1012     } 
1013  
1014 B<Test File> test.pl 
1015  
1016     use warnings; 
1017     use strict; 
1018     use DB::Schema; 
1019      
1020     my $user_data = { email    => 'someguy@place.com',  
1021                       password => 'pass1',  
1022                       admin    => 0 }; 
1023                            
1024     my $admin_data = { email    => 'someadmin@adminplace.com',  
1025                        password => 'pass2',  
1026                        admin    => 1 }; 
1027                            
1028     my $schema = DB::Schema->connection('dbi:Pg:dbname=test'); 
1029      
1030     $schema->resultset('User')->create( $user_data ); 
1031     $schema->resultset('User')->create( $admin_data ); 
1032      
1033     ### Now we search for them 
1034     my $user = $schema->resultset('User')->single( $user_data ); 
1035     my $admin = $schema->resultset('User')->single( $admin_data ); 
1036      
1037     print ref $user, "\n"; 
1038     print ref $admin, "\n"; 
1039      
1040     print $user->password , "\n"; # pass1 
1041     print $admin->password , "\n";# pass2; inherited from User 
1042     print $user->hello , "\n";# I am a regular user. 
1043     print $admin->hello, "\n";# I am an admin. 
1044  
1045     ### The statement below will NOT print 
1046     print "I can do admin stuff\n" if $user->can('do_admin_stuff'); 
1047     ### The statement below will print 
1048     print "I can do admin stuff\n" if $admin->can('do_admin_stuff'); 
1049
1050 =cut