Dynamically load necessary table classes
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Manual / Cookbook.pod
1 =head1 NAME
2
3 DBIx::Class::Manual::Cookbook - Miscellaneous recipes
4
5 =head1 SEARCHING
6
7 =head2 Paged results
8
9 When you expect a large number of results, you can ask L<DBIx::Class> for a
10 paged resultset, which will fetch only a defined number of records at a time:
11
12   my $rs = $schema->resultset('Artist')->search(
13     undef,
14     {
15       page => 1,  # page to return (defaults to 1)
16       rows => 10, # number of results per page
17     },
18   );
19
20   return $rs->all(); # all records for page 1
21
22   return $rs->page(2); # records for page 2
23
24 You can get a L<Data::Page> object for the resultset (suitable for use
25 in e.g. a template) using the C<pager> method:
26
27   return $rs->pager();
28
29 =head2 Complex WHERE clauses
30
31 Sometimes you need to formulate a query using specific operators:
32
33   my @albums = $schema->resultset('Album')->search({
34     artist => { 'like', '%Lamb%' },
35     title  => { 'like', '%Fear of Fours%' },
36   });
37
38 This results in something like the following C<WHERE> clause:
39
40   WHERE artist LIKE '%Lamb%' AND title LIKE '%Fear of Fours%'
41
42 Other queries might require slightly more complex logic:
43
44   my @albums = $schema->resultset('Album')->search({
45     -or => [
46       -and => [
47         artist => { 'like', '%Smashing Pumpkins%' },
48         title  => 'Siamese Dream',
49       ],
50       artist => 'Starchildren',
51     ],
52   });
53
54 This results in the following C<WHERE> clause:
55
56   WHERE ( artist LIKE '%Smashing Pumpkins%' AND title = 'Siamese Dream' )
57     OR artist = 'Starchildren'
58
59 For more information on generating complex queries, see
60 L<SQL::Abstract/WHERE CLAUSES>.
61
62 =head2 Retrieve one and only one row from a resultset
63
64 Sometimes you need only the first "top" row of a resultset. While this
65 can be easily done with L<< $rs->first|DBIx::Class::ResultSet/first
66 >>, it is suboptimal, as a full blown cursor for the resultset will be
67 created and then immediately destroyed after fetching the first row
68 object.  L<< $rs->single|DBIx::Class::ResultSet/single >> is designed
69 specifically for this case - it will grab the first returned result
70 without even instantiating a cursor.
71
72 Before replacing all your calls to C<first()> with C<single()> please observe the
73 following CAVEATS:
74
75 =over
76
77 =item *
78
79 While single() takes a search condition just like search() does, it does
80 _not_ accept search attributes. However one can always chain a single() to
81 a search():
82
83   my $top_cd = $cd_rs->search({}, { order_by => 'rating' })->single;
84
85
86 =item *
87
88 Since single() is the engine behind find(), it is designed to fetch a
89 single row per database query. Thus a warning will be issued when the
90 underlying SELECT returns more than one row. Sometimes however this usage
91 is valid: i.e. we have an arbitrary number of cd's but only one of them is
92 at the top of the charts at any given time. If you know what you are doing,
93 you can silence the warning by explicitly limiting the resultset size:
94
95   my $top_cd = $cd_rs->search ({}, { order_by => 'rating', rows => 1 })->single;
96
97 =back
98
99 =head2 Arbitrary SQL through a custom ResultSource
100
101 Sometimes you have to run arbitrary SQL because your query is too complex
102 (e.g. it contains Unions, Sub-Selects, Stored Procedures, etc.) or has to
103 be optimized for your database in a special way, but you still want to
104 get the results as a L<DBIx::Class::ResultSet>.
105
106 The recommended way to accomplish this is by defining a separate
107 L<ResultSource::View|DBIx::Class::ResultSource::View> for your query.
108
109   package My::Schema::Result::UserFriendsComplex;
110   use strict;
111   use warnings;
112   use base qw/DBIx::Class/;
113
114   __PACKAGE__->load_components('Core');
115   __PACKAGE__->table_class('DBIx::Class::ResultSource::View');
116
117   # ->table, ->add_columns, etc.
118
119   __PACKAGE__->result_source_instance->is_virtual(1);
120   __PACKAGE__->result_source_instance->view_definition(q[
121     SELECT u.* FROM user u
122     INNER JOIN user_friends f ON u.id = f.user_id
123     WHERE f.friend_user_id = ?
124     UNION
125     SELECT u.* FROM user u
126     INNER JOIN user_friends f ON u.id = f.friend_user_id
127     WHERE f.user_id = ?
128   ]);
129
130 Next, you can execute your complex query using bind parameters like this:
131
132   my $friends = $schema->resultset( 'UserFriendsComplex' )->search( {},
133     {
134       bind  => [ 12345, 12345 ]
135     }
136   );
137
138 ... and you'll get back a perfect L<DBIx::Class::ResultSet> (except, of course,
139 that you cannot modify the rows it contains, ie. cannot call L</update>,
140 L</delete>, ...  on it).
141
142 Note that you cannot have bind parameters unless is_virtual is set to true.
143
144 =head2 Using specific columns
145
146 When you only want specific columns from a table, you can use
147 C<columns> to specify which ones you need. This is useful to avoid
148 loading columns with large amounts of data that you aren't about to
149 use anyway:
150
151   my $rs = $schema->resultset('Artist')->search(
152     undef,
153     {
154       columns => [qw/ name /]
155     }
156   );
157
158   # Equivalent SQL:
159   # SELECT artist.name FROM artist
160
161 This is a shortcut for C<select> and C<as>, see below. C<columns>
162 cannot be used together with C<select> and C<as>.
163
164 =head2 Using database functions or stored procedures
165
166 The combination of C<select> and C<as> can be used to return the result of a
167 database function or stored procedure as a column value. You use C<select> to
168 specify the source for your column value (e.g. a column name, function, or
169 stored procedure name). You then use C<as> to set the column name you will use
170 to access the returned value:
171
172   my $rs = $schema->resultset('Artist')->search(
173     {},
174     {
175       select => [ 'name', { LENGTH => 'name' } ],
176       as     => [qw/ name name_length /],
177     }
178   );
179
180   # Equivalent SQL:
181   # SELECT name name, LENGTH( name )
182   # FROM artist
183
184 Note that the C< as > attribute has absolutely nothing to with the sql
185 syntax C< SELECT foo AS bar > (see the documentation in
186 L<DBIx::Class::ResultSet/ATTRIBUTES>).  If your alias exists as a
187 column in your base class (i.e. it was added with C<add_columns>), you
188 just access it as normal. Our C<Artist> class has a C<name> column, so
189 we just use the C<name> accessor:
190
191   my $artist = $rs->first();
192   my $name = $artist->name();
193
194 If on the other hand the alias does not correspond to an existing column, you
195 have to fetch the value using the C<get_column> accessor:
196
197   my $name_length = $artist->get_column('name_length');
198
199 If you don't like using C<get_column>, you can always create an accessor for
200 any of your aliases using either of these:
201
202   # Define accessor manually:
203   sub name_length { shift->get_column('name_length'); }
204
205   # Or use DBIx::Class::AccessorGroup:
206   __PACKAGE__->mk_group_accessors('column' => 'name_length');
207
208 =head2 SELECT DISTINCT with multiple columns
209
210   my $rs = $schema->resultset('Artist')->search(
211     {},
212     {
213       columns => [ qw/artist_id name rank/ ],
214       distinct => 1
215     }
216   );
217
218   my $rs = $schema->resultset('Artist')->search(
219     {},
220     {
221       columns => [ qw/artist_id name rank/ ],
222       group_by => [ qw/artist_id name rank/ ],
223     }
224   );
225
226   # Equivalent SQL:
227   # SELECT me.artist_id, me.name, me.rank
228   # FROM artist me
229   # GROUP BY artist_id, name, rank
230
231 =head2 SELECT COUNT(DISTINCT colname)
232
233   my $rs = $schema->resultset('Artist')->search(
234     {},
235     {
236       columns => [ qw/name/ ],
237       distinct => 1
238     }
239   );
240
241   my $rs = $schema->resultset('Artist')->search(
242     {},
243     {
244       columns => [ qw/name/ ],
245       group_by => [ qw/name/ ],
246     }
247   );
248
249   my $count = $rs->count;
250
251   # Equivalent SQL:
252   # SELECT COUNT( * ) FROM (SELECT me.name FROM artist me GROUP BY me.name) count_subq:
253
254 =head2 Grouping results
255
256 L<DBIx::Class> supports C<GROUP BY> as follows:
257
258   my $rs = $schema->resultset('Artist')->search(
259     {},
260     {
261       join     => [qw/ cds /],
262       select   => [ 'name', { count => 'cds.id' } ],
263       as       => [qw/ name cd_count /],
264       group_by => [qw/ name /]
265     }
266   );
267
268   # Equivalent SQL:
269   # SELECT name, COUNT( cd.id ) FROM artist
270   # LEFT JOIN cd ON artist.id = cd.artist
271   # GROUP BY name
272
273 Please see L<DBIx::Class::ResultSet/ATTRIBUTES> documentation if you
274 are in any way unsure about the use of the attributes above (C< join
275 >, C< select >, C< as > and C< group_by >).
276
277 =head2 Subqueries (EXPERIMENTAL)
278
279 You can write subqueries relatively easily in DBIC.
280
281   my $inside_rs = $schema->resultset('Artist')->search({
282     name => [ 'Billy Joel', 'Brittany Spears' ],
283   });
284
285   my $rs = $schema->resultset('CD')->search({
286     artist_id => { 'IN' => $inside_rs->get_column('id')->as_query },
287   });
288
289 The usual operators ( =, !=, IN, NOT IN, etc) are supported.
290
291 B<NOTE>: You have to explicitly use '=' when doing an equality comparison.
292 The following will B<not> work:
293
294   my $rs = $schema->resultset('CD')->search({
295     artist_id => $inside_rs->get_column('id')->as_query,
296   });
297
298 =head3 Support
299
300 Subqueries are supported in the where clause (first hashref), and in the
301 from, select, and +select attributes.
302
303 =head3 Correlated subqueries
304
305   my $cdrs = $schema->resultset('CD');
306   my $rs = $cdrs->search({
307     year => {
308       '=' => $cdrs->search(
309         { artist_id => { '=' => \'me.artist_id' } },
310         { alias => 'inner' }
311       )->get_column('year')->max_rs->as_query,
312     },
313   });
314
315 That creates the following SQL:
316
317   SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track
318     FROM cd me
319    WHERE year = (
320       SELECT MAX(inner.year)
321         FROM cd inner
322        WHERE artist_id = me.artist_id
323       )
324
325 =head3 EXPERIMENTAL
326
327 Please note that subqueries are considered an experimental feature.
328
329 =head2 Predefined searches
330
331 You can write your own L<DBIx::Class::ResultSet> class by inheriting from it
332 and defining often used searches as methods:
333
334   package My::DBIC::ResultSet::CD;
335   use strict;
336   use warnings;
337   use base 'DBIx::Class::ResultSet';
338
339   sub search_cds_ordered {
340       my ($self) = @_;
341
342       return $self->search(
343           {},
344           { order_by => 'name DESC' },
345       );
346   }
347
348   1;
349
350 To use your resultset, first tell DBIx::Class to create an instance of it
351 for you, in your My::DBIC::Schema::CD class:
352
353   # class definition as normal
354   __PACKAGE__->load_components(qw/ Core /);
355   __PACKAGE__->table('cd');
356
357   # tell DBIC to use the custom ResultSet class
358   __PACKAGE__->resultset_class('My::DBIC::ResultSet::CD');
359
360 Note that C<resultset_class> must be called after C<load_components> and C<table>, or you will get errors about missing methods.
361
362 Then call your new method in your code:
363
364    my $ordered_cds = $schema->resultset('CD')->search_cds_ordered();
365
366 =head2 Using SQL functions on the left hand side of a comparison
367
368 Using SQL functions on the left hand side of a comparison is generally
369 not a good idea since it requires a scan of the entire table.  However,
370 it can be accomplished with C<DBIx::Class> when necessary.
371
372 If you do not have quoting on, simply include the function in your search
373 specification as you would any column:
374
375   $rs->search({ 'YEAR(date_of_birth)' => 1979 });
376
377 With quoting on, or for a more portable solution, use the C<where>
378 attribute:
379
380   $rs->search({}, { where => \'YEAR(date_of_birth) = 1979' });
381
382 =begin hidden
383
384 (When the bind args ordering bug is fixed, this technique will be better
385 and can replace the one above.)
386
387 With quoting on, or for a more portable solution, use the C<where> and
388 C<bind> attributes:
389
390   $rs->search({}, {
391       where => \'YEAR(date_of_birth) = ?',
392       bind  => [ 1979 ]
393   });
394
395 =end hidden
396
397 =head1 JOINS AND PREFETCHING
398
399 =head2 Using joins and prefetch
400
401 You can use the C<join> attribute to allow searching on, or sorting your
402 results by, one or more columns in a related table.
403
404 This requires that you have defined the L<DBIx::Class::Relationship>. For example :
405
406   My::Schema::CD->has_many( artists => 'My::Schema::Artist', 'artist_id');
407
408 To return all CDs matching a particular artist name, you specify the name of the relationship ('artists'):
409
410   my $rs = $schema->resultset('CD')->search(
411     {
412       'artists.name' => 'Bob Marley'
413     },
414     {
415       join => 'artists', # join the artist table
416     }
417   );
418
419   # Equivalent SQL:
420   # SELECT cd.* FROM cd
421   # JOIN artist ON cd.artist = artist.id
422   # WHERE artist.name = 'Bob Marley'
423
424 In that example both the join, and the condition use the relationship name rather than the table name
425 (see L<DBIx::Class::Manual::Joining> for more details on aliasing ).
426
427 If required, you can now sort on any column in the related tables by including
428 it in your C<order_by> attribute, (again using the aliased relation name rather than table name) :
429
430   my $rs = $schema->resultset('CD')->search(
431     {
432       'artists.name' => 'Bob Marley'
433     },
434     {
435       join     => 'artists',
436       order_by => [qw/ artists.name /]
437     }
438   );
439
440   # Equivalent SQL:
441   # SELECT cd.* FROM cd
442   # JOIN artist ON cd.artist = artist.id
443   # WHERE artist.name = 'Bob Marley'
444   # ORDER BY artist.name
445
446 Note that the C<join> attribute should only be used when you need to search or
447 sort using columns in a related table. Joining related tables when you only
448 need columns from the main table will make performance worse!
449
450 Now let's say you want to display a list of CDs, each with the name of the
451 artist. The following will work fine:
452
453   while (my $cd = $rs->next) {
454     print "CD: " . $cd->title . ", Artist: " . $cd->artist->name;
455   }
456
457 There is a problem however. We have searched both the C<cd> and C<artist> tables
458 in our main query, but we have only returned data from the C<cd> table. To get
459 the artist name for any of the CD objects returned, L<DBIx::Class> will go back
460 to the database:
461
462   SELECT artist.* FROM artist WHERE artist.id = ?
463
464 A statement like the one above will run for each and every CD returned by our
465 main query. Five CDs, five extra queries. A hundred CDs, one hundred extra
466 queries!
467
468 Thankfully, L<DBIx::Class> has a C<prefetch> attribute to solve this problem.
469 This allows you to fetch results from related tables in advance:
470
471   my $rs = $schema->resultset('CD')->search(
472     {
473       'artists.name' => 'Bob Marley'
474     },
475     {
476       join     => 'artists',
477       order_by => [qw/ artists.name /],
478       prefetch => 'artists' # return artist data too!
479     }
480   );
481
482   # Equivalent SQL (note SELECT from both "cd" and "artist"):
483   # SELECT cd.*, artist.* FROM cd
484   # JOIN artist ON cd.artist = artist.id
485   # WHERE artist.name = 'Bob Marley'
486   # ORDER BY artist.name
487
488 The code to print the CD list remains the same:
489
490   while (my $cd = $rs->next) {
491     print "CD: " . $cd->title . ", Artist: " . $cd->artist->name;
492   }
493
494 L<DBIx::Class> has now prefetched all matching data from the C<artist> table,
495 so no additional SQL statements are executed. You now have a much more
496 efficient query.
497
498 Also note that C<prefetch> should only be used when you know you will
499 definitely use data from a related table. Pre-fetching related tables when you
500 only need columns from the main table will make performance worse!
501
502 =head2 Multiple joins
503
504 In the examples above, the C<join> attribute was a scalar.  If you
505 pass an array reference instead, you can join to multiple tables.  In
506 this example, we want to limit the search further, using
507 C<LinerNotes>:
508
509   # Relationships defined elsewhere:
510   # CD->belongs_to('artist' => 'Artist');
511   # CD->has_one('liner_notes' => 'LinerNotes', 'cd');
512   my $rs = $schema->resultset('CD')->search(
513     {
514       'artist.name' => 'Bob Marley'
515       'liner_notes.notes' => { 'like', '%some text%' },
516     },
517     {
518       join     => [qw/ artist liner_notes /],
519       order_by => [qw/ artist.name /],
520     }
521   );
522
523   # Equivalent SQL:
524   # SELECT cd.*, artist.*, liner_notes.* FROM cd
525   # JOIN artist ON cd.artist = artist.id
526   # JOIN liner_notes ON cd.id = liner_notes.cd
527   # WHERE artist.name = 'Bob Marley'
528   # ORDER BY artist.name
529
530 =head2 Multi-step joins
531
532 Sometimes you want to join more than one relationship deep. In this example,
533 we want to find all C<Artist> objects who have C<CD>s whose C<LinerNotes>
534 contain a specific string:
535
536   # Relationships defined elsewhere:
537   # Artist->has_many('cds' => 'CD', 'artist');
538   # CD->has_one('liner_notes' => 'LinerNotes', 'cd');
539
540   my $rs = $schema->resultset('Artist')->search(
541     {
542       'liner_notes.notes' => { 'like', '%some text%' },
543     },
544     {
545       join => {
546         'cds' => 'liner_notes'
547       }
548     }
549   );
550
551   # Equivalent SQL:
552   # SELECT artist.* FROM artist
553   # LEFT JOIN cd ON artist.id = cd.artist
554   # LEFT JOIN liner_notes ON cd.id = liner_notes.cd
555   # WHERE liner_notes.notes LIKE '%some text%'
556
557 Joins can be nested to an arbitrary level. So if we decide later that we
558 want to reduce the number of Artists returned based on who wrote the liner
559 notes:
560
561   # Relationship defined elsewhere:
562   # LinerNotes->belongs_to('author' => 'Person');
563
564   my $rs = $schema->resultset('Artist')->search(
565     {
566       'liner_notes.notes' => { 'like', '%some text%' },
567       'author.name' => 'A. Writer'
568     },
569     {
570       join => {
571         'cds' => {
572           'liner_notes' => 'author'
573         }
574       }
575     }
576   );
577
578   # Equivalent SQL:
579   # SELECT artist.* FROM artist
580   # LEFT JOIN cd ON artist.id = cd.artist
581   # LEFT JOIN liner_notes ON cd.id = liner_notes.cd
582   # LEFT JOIN author ON author.id = liner_notes.author
583   # WHERE liner_notes.notes LIKE '%some text%'
584   # AND author.name = 'A. Writer'
585
586 =head2 Multi-step and multiple joins
587
588 With various combinations of array and hash references, you can join
589 tables in any combination you desire.  For example, to join Artist to
590 CD and Concert, and join CD to LinerNotes:
591
592   # Relationships defined elsewhere:
593   # Artist->has_many('concerts' => 'Concert', 'artist');
594
595   my $rs = $schema->resultset('Artist')->search(
596     { },
597     {
598       join => [
599         {
600           cds => 'liner_notes'
601         },
602         'concerts'
603       ],
604     }
605   );
606
607   # Equivalent SQL:
608   # SELECT artist.* FROM artist
609   # LEFT JOIN cd ON artist.id = cd.artist
610   # LEFT JOIN liner_notes ON cd.id = liner_notes.cd
611   # LEFT JOIN concert ON artist.id = concert.artist
612
613 =head2 Multi-step prefetch
614
615 C<prefetch> can be nested more than one relationship
616 deep using the same syntax as a multi-step join:
617
618   my $rs = $schema->resultset('Tag')->search(
619     {},
620     {
621       prefetch => {
622         cd => 'artist'
623       }
624     }
625   );
626
627   # Equivalent SQL:
628   # SELECT tag.*, cd.*, artist.* FROM tag
629   # JOIN cd ON tag.cd = cd.id
630   # JOIN artist ON cd.artist = artist.id
631
632 Now accessing our C<cd> and C<artist> relationships does not need additional
633 SQL statements:
634
635   my $tag = $rs->first;
636   print $tag->cd->artist->name;
637
638 =head1 ROW-LEVEL OPERATIONS
639
640 =head2 Retrieving a row object's Schema
641
642 It is possible to get a Schema object from a row object like so:
643
644   my $schema = $cd->result_source->schema;
645   # use the schema as normal:
646   my $artist_rs = $schema->resultset('Artist');
647
648 This can be useful when you don't want to pass around a Schema object to every
649 method.
650
651 =head2 Getting the value of the primary key for the last database insert
652
653 AKA getting last_insert_id
654
655 Thanks to the core component PK::Auto, this is straightforward:
656
657   my $foo = $rs->create(\%blah);
658   # do more stuff
659   my $id = $foo->id; # foo->my_primary_key_field will also work.
660
661 If you are not using autoincrementing primary keys, this will probably
662 not work, but then you already know the value of the last primary key anyway.
663
664 =head2 Stringification
665
666 Employ the standard stringification technique by using the L<overload>
667 module.
668
669 To make an object stringify itself as a single column, use something
670 like this (replace C<name> with the column/method of your choice):
671
672   use overload '""' => sub { shift->name}, fallback => 1;
673
674 For more complex stringification, you can use an anonymous subroutine:
675
676   use overload '""' => sub { $_[0]->name . ", " .
677                              $_[0]->address }, fallback => 1;
678
679 =head3 Stringification Example
680
681 Suppose we have two tables: C<Product> and C<Category>. The table
682 specifications are:
683
684   Product(id, Description, category)
685   Category(id, Description)
686
687 C<category> is a foreign key into the Category table.
688
689 If you have a Product object C<$obj> and write something like
690
691   print $obj->category
692
693 things will not work as expected.
694
695 To obtain, for example, the category description, you should add this
696 method to the class defining the Category table:
697
698   use overload "" => sub {
699       my $self = shift;
700
701       return $self->Description;
702   }, fallback => 1;
703
704 =head2 Want to know if find_or_create found or created a row?
705
706 Just use C<find_or_new> instead, then check C<in_storage>:
707
708   my $obj = $rs->find_or_new({ blah => 'blarg' });
709   unless ($obj->in_storage) {
710     $obj->insert;
711     # do whatever else you wanted if it was a new row
712   }
713
714 =head2 Static sub-classing DBIx::Class result classes
715
716 AKA adding additional relationships/methods/etc. to a model for a
717 specific usage of the (shared) model.
718
719 B<Schema definition>
720
721     package My::App::Schema;
722
723     use base DBIx::Class::Schema;
724
725     # load subclassed classes from My::App::Schema::Result/ResultSet
726     __PACKAGE__->load_namespaces;
727
728     # load classes from shared model
729     load_classes({
730         'My::Shared::Model::Result' => [qw/
731             Foo
732             Bar
733         /]});
734
735     1;
736
737 B<Result-Subclass definition>
738
739     package My::App::Schema::Result::Baz;
740
741     use strict;
742     use warnings;
743     use base My::Shared::Model::Result::Baz;
744
745     # WARNING: Make sure you call table() again in your subclass,
746     # otherwise DBIx::Class::ResultSourceProxy::Table will not be called
747     # and the class name is not correctly registered as a source
748     __PACKAGE__->table('baz');
749
750     sub additional_method {
751         return "I'm an additional method only needed by this app";
752     }
753
754     1;
755
756 =head2 Dynamic Sub-classing DBIx::Class proxy classes
757
758 AKA multi-class object inflation from one table
759
760 L<DBIx::Class> classes are proxy classes, therefore some different
761 techniques need to be employed for more than basic subclassing.  In
762 this example we have a single user table that carries a boolean bit
763 for admin.  We would like like to give the admin users
764 objects (L<DBIx::Class::Row>) the same methods as a regular user but
765 also special admin only methods.  It doesn't make sense to create two
766 seperate proxy-class files for this.  We would be copying all the user
767 methods into the Admin class.  There is a cleaner way to accomplish
768 this.
769
770 Overriding the C<inflate_result> method within the User proxy-class
771 gives us the effect we want.  This method is called by
772 L<DBIx::Class::ResultSet> when inflating a result from storage.  So we
773 grab the object being returned, inspect the values we are looking for,
774 bless it if it's an admin object, and then return it.  See the example
775 below:
776
777 B<Schema Definition>
778
779     package My::Schema;
780
781     use base qw/DBIx::Class::Schema/;
782
783     __PACKAGE__->load_namespaces;
784
785     1;
786
787
788 B<Proxy-Class definitions>
789
790     package My::Schema::Result::User;
791
792     use strict;
793     use warnings;
794     use base qw/DBIx::Class/;
795
796     ### Define what our admin class is, for ensure_class_loaded()
797     my $admin_class = __PACKAGE__ . '::Admin';
798
799     __PACKAGE__->load_components(qw/Core/);
800
801     __PACKAGE__->table('users');
802
803     __PACKAGE__->add_columns(qw/user_id   email    password
804                                 firstname lastname active
805                                 admin/);
806
807     __PACKAGE__->set_primary_key('user_id');
808
809     sub inflate_result {
810         my $self = shift;
811         my $ret = $self->next::method(@_);
812         if( $ret->admin ) {### If this is an admin, rebless for extra functions
813             $self->ensure_class_loaded( $admin_class );
814             bless $ret, $admin_class;
815         }
816         return $ret;
817     }
818
819     sub hello {
820         print "I am a regular user.\n";
821         return ;
822     }
823
824     1;
825
826
827     package My::Schema::Result::User::Admin;
828
829     use strict;
830     use warnings;
831     use base qw/My::Schema::Result::User/;
832
833     # This line is important
834     __PACKAGE__->table('users');
835
836     sub hello
837     {
838         print "I am an admin.\n";
839         return;
840     }
841
842     sub do_admin_stuff
843     {
844         print "I am doing admin stuff\n";
845         return ;
846     }
847
848     1;
849
850 B<Test File> test.pl
851
852     use warnings;
853     use strict;
854     use My::Schema;
855
856     my $user_data = { email    => 'someguy@place.com',
857                       password => 'pass1',
858                       admin    => 0 };
859
860     my $admin_data = { email    => 'someadmin@adminplace.com',
861                        password => 'pass2',
862                        admin    => 1 };
863
864     my $schema = My::Schema->connection('dbi:Pg:dbname=test');
865
866     $schema->resultset('User')->create( $user_data );
867     $schema->resultset('User')->create( $admin_data );
868
869     ### Now we search for them
870     my $user = $schema->resultset('User')->single( $user_data );
871     my $admin = $schema->resultset('User')->single( $admin_data );
872
873     print ref $user, "\n";
874     print ref $admin, "\n";
875
876     print $user->password , "\n"; # pass1
877     print $admin->password , "\n";# pass2; inherited from User
878     print $user->hello , "\n";# I am a regular user.
879     print $admin->hello, "\n";# I am an admin.
880
881     ### The statement below will NOT print
882     print "I can do admin stuff\n" if $user->can('do_admin_stuff');
883     ### The statement below will print
884     print "I can do admin stuff\n" if $admin->can('do_admin_stuff');
885
886 =head2 Skip row object creation for faster results
887
888 DBIx::Class is not built for speed, it's built for convenience and
889 ease of use, but sometimes you just need to get the data, and skip the
890 fancy objects.
891
892 To do this simply use L<DBIx::Class::ResultClass::HashRefInflator>.
893
894  my $rs = $schema->resultset('CD');
895
896  $rs->result_class('DBIx::Class::ResultClass::HashRefInflator');
897
898  my $hash_ref = $rs->find(1);
899
900 Wasn't that easy?
901
902 Beware, changing the Result class using
903 L<DBIx::Class::ResultSet/result_class> will replace any existing class
904 completely including any special components loaded using
905 load_components, eg L<DBIx::Class::InflateColumn::DateTime>.
906
907 =head2 Get raw data for blindingly fast results
908
909 If the L<HashRefInflator|DBIx::Class::ResultClass::HashRefInflator> solution
910 above is not fast enough for you, you can use a DBIx::Class to return values
911 exactly as they come out of the database with none of the convenience methods
912 wrapped round them.
913
914 This is used like so:
915
916   my $cursor = $rs->cursor
917   while (my @vals = $cursor->next) {
918       # use $val[0..n] here
919   }
920
921 You will need to map the array offsets to particular columns (you can
922 use the L<DBIx::Class::ResultSet/select> attribute of L<DBIx::Class::ResultSet/search> to force ordering).
923
924 =head1 RESULTSET OPERATIONS
925
926 =head2 Getting Schema from a ResultSet
927
928 To get the L<DBIx::Class::Schema> object from a ResultSet, do the following:
929
930  $rs->result_source->schema
931
932 =head2 Getting Columns Of Data
933
934 AKA Aggregating Data
935
936 If you want to find the sum of a particular column there are several
937 ways, the obvious one is to use search:
938
939   my $rs = $schema->resultset('Items')->search(
940     {},
941     {
942        select => [ { sum => 'Cost' } ],
943        as     => [ 'total_cost' ], # remember this 'as' is for DBIx::Class::ResultSet not SQL
944     }
945   );
946   my $tc = $rs->first->get_column('total_cost');
947
948 Or, you can use the L<DBIx::Class::ResultSetColumn>, which gets
949 returned when you ask the C<ResultSet> for a column using
950 C<get_column>:
951
952   my $cost = $schema->resultset('Items')->get_column('Cost');
953   my $tc = $cost->sum;
954
955 With this you can also do:
956
957   my $minvalue = $cost->min;
958   my $maxvalue = $cost->max;
959
960 Or just iterate through the values of this column only:
961
962   while ( my $c = $cost->next ) {
963     print $c;
964   }
965
966   foreach my $c ($cost->all) {
967     print $c;
968   }
969
970 C<ResultSetColumn> only has a limited number of built-in functions. If
971 you need one that it doesn't have, then you can use the C<func> method
972 instead:
973
974   my $avg = $cost->func('AVERAGE');
975
976 This will cause the following SQL statement to be run:
977
978   SELECT AVERAGE(Cost) FROM Items me
979
980 Which will of course only work if your database supports this function.
981 See L<DBIx::Class::ResultSetColumn> for more documentation.
982
983 =head2 Creating a result set from a set of rows
984
985 Sometimes you have a (set of) row objects that you want to put into a
986 resultset without the need to hit the DB again. You can do that by using the
987 L<set_cache|DBIx::Class::Resultset/set_cache> method:
988
989  my @uploadable_groups;
990  while (my $group = $groups->next) {
991    if ($group->can_upload($self)) {
992      push @uploadable_groups, $group;
993    }
994  }
995  my $new_rs = $self->result_source->resultset;
996  $new_rs->set_cache(\@uploadable_groups);
997  return $new_rs;
998
999
1000 =head1 USING RELATIONSHIPS
1001
1002 =head2 Create a new row in a related table
1003
1004   my $author = $book->create_related('author', { name => 'Fred'});
1005
1006 =head2 Search in a related table
1007
1008 Only searches for books named 'Titanic' by the author in $author.
1009
1010   my $books_rs = $author->search_related('books', { name => 'Titanic' });
1011
1012 =head2 Delete data in a related table
1013
1014 Deletes only the book named Titanic by the author in $author.
1015
1016   $author->delete_related('books', { name => 'Titanic' });
1017
1018 =head2 Ordering a relationship result set
1019
1020 If you always want a relation to be ordered, you can specify this when you
1021 create the relationship.
1022
1023 To order C<< $book->pages >> by descending page_number, create the relation
1024 as follows:
1025
1026   __PACKAGE__->has_many('pages' => 'Page', 'book', { order_by => \'page_number DESC'} );
1027
1028 =head2 Filtering a relationship result set
1029
1030 If you want to get a filtered result set, you can just add add to $attr as follows:
1031
1032  __PACKAGE__->has_many('pages' => 'Page', 'book', { where => { scrap => 0 } } );
1033
1034 =head2 Many-to-many relationships
1035
1036 This is straightforward using L<ManyToMany|DBIx::Class::Relationship/many_to_many>:
1037
1038   package My::User;
1039   use base 'DBIx::Class';
1040   __PACKAGE__->load_components('Core');
1041   __PACKAGE__->table('user');
1042   __PACKAGE__->add_columns(qw/id name/);
1043   __PACKAGE__->set_primary_key('id');
1044   __PACKAGE__->has_many('user_address' => 'My::UserAddress', 'user');
1045   __PACKAGE__->many_to_many('addresses' => 'user_address', 'address');
1046
1047   package My::UserAddress;
1048   use base 'DBIx::Class';
1049   __PACKAGE__->load_components('Core');
1050   __PACKAGE__->table('user_address');
1051   __PACKAGE__->add_columns(qw/user address/);
1052   __PACKAGE__->set_primary_key(qw/user address/);
1053   __PACKAGE__->belongs_to('user' => 'My::User');
1054   __PACKAGE__->belongs_to('address' => 'My::Address');
1055
1056   package My::Address;
1057   use base 'DBIx::Class';
1058   __PACKAGE__->load_components('Core');
1059   __PACKAGE__->table('address');
1060   __PACKAGE__->add_columns(qw/id street town area_code country/);
1061   __PACKAGE__->set_primary_key('id');
1062   __PACKAGE__->has_many('user_address' => 'My::UserAddress', 'address');
1063   __PACKAGE__->many_to_many('users' => 'user_address', 'user');
1064
1065   $rs = $user->addresses(); # get all addresses for a user
1066   $rs = $address->users(); # get all users for an address
1067
1068 =head2 Relationships across DB schemas
1069
1070 Mapping relationships across L<DB schemas|DBIx::Class::Manual::Glossary/DB schema>
1071 is easy as long as the schemas themselves are all accessible via the same DBI
1072 connection. In most cases, this means that they are on the same database host
1073 as each other and your connecting database user has the proper permissions to them.
1074
1075 To accomplish this one only needs to specify the DB schema name in the table
1076 declaration, like so...
1077
1078   package MyDatabase::Main::Artist;
1079   use base qw/DBIx::Class/;
1080   __PACKAGE__->load_components(qw/PK::Auto Core/);
1081
1082   __PACKAGE__->table('database1.artist'); # will use "database1.artist" in FROM clause
1083
1084   __PACKAGE__->add_columns(qw/ artist_id name /);
1085   __PACKAGE__->set_primary_key('artist_id');
1086   __PACKAGE__->has_many('cds' => 'MyDatabase::Main::Cd');
1087
1088   1;
1089
1090 Whatever string you specify there will be used to build the "FROM" clause in SQL
1091 queries.
1092
1093 The big drawback to this is you now have DB schema names hardcoded in your
1094 class files. This becomes especially troublesome if you have multiple instances
1095 of your application to support a change lifecycle (e.g. DEV, TEST, PROD) and
1096 the DB schemas are named based on the environment (e.g. database1_dev).
1097
1098 However, one can dynamically "map" to the proper DB schema by overriding the
1099 L<connection|DBIx::Class::Schama/connection> method in your Schema class and
1100 building a renaming facility, like so:
1101
1102   package MyDatabase::Schema;
1103   use Moose;
1104
1105   extends 'DBIx::Class::Schema';
1106
1107   around connection => sub {
1108     my ( $inner, $self, $dsn, $username, $pass, $attr ) = ( shift, @_ );
1109
1110     my $postfix = delete $attr->{schema_name_postfix};
1111
1112     $inner->(@_);
1113
1114     if ( $postfix ) {
1115         $self->append_db_name($postfix);
1116     }
1117   };
1118
1119   sub append_db_name {
1120     my ( $self, $postfix ) = @_;
1121
1122     my @sources_with_db
1123         = grep
1124             { $_->name =~ /^\w+\./mx }
1125             map
1126                 { $self->source($_) }
1127                 $self->sources;
1128
1129     foreach my $source (@sources_with_db) {
1130         my $name = $source->name;
1131         $name =~ s{^(\w+)\.}{${1}${postfix}\.}mx;
1132
1133         $source->name($name);
1134     }
1135   }
1136
1137   1;
1138
1139 By overridding the L<connection|DBIx::Class::Schama/connection>
1140 method and extracting a custom option from the provided \%attr hashref one can
1141 then simply iterate over all the Schema's ResultSources, renaming them as
1142 needed.
1143
1144 To use this facility, simply add or modify the \%attr hashref that is passed to
1145 L<connection|DBIx::Class::Schama/connect>, as follows:
1146
1147   my $schema
1148     = MyDatabase::Schema->connect(
1149       $dsn,
1150       $user,
1151       $pass,
1152       {
1153         schema_name_postfix => '_dev'
1154         # ... Other options as desired ...
1155       })
1156
1157 Obviously, one could accomplish even more advanced mapping via a hash map or a
1158 callback routine.
1159
1160 =head1 TRANSACTIONS
1161
1162 As of version 0.04001, there is improved transaction support in
1163 L<DBIx::Class::Storage> and L<DBIx::Class::Schema>.  Here is an
1164 example of the recommended way to use it:
1165
1166   my $genus = $schema->resultset('Genus')->find(12);
1167
1168   my $coderef2 = sub {
1169     $genus->extinct(1);
1170     $genus->update;
1171   };
1172
1173   my $coderef1 = sub {
1174     $genus->add_to_species({ name => 'troglodyte' });
1175     $genus->wings(2);
1176     $genus->update;
1177     $schema->txn_do($coderef2); # Can have a nested transaction. Only the outer will actualy commit
1178     return $genus->species;
1179   };
1180
1181   my $rs;
1182   eval {
1183     $rs = $schema->txn_do($coderef1);
1184   };
1185
1186   if ($@) {                             # Transaction failed
1187     die "the sky is falling!"           #
1188       if ($@ =~ /Rollback failed/);     # Rollback failed
1189
1190     deal_with_failed_transaction();
1191   }
1192
1193 Nested transactions will work as expected. That is, only the outermost
1194 transaction will actually issue a commit to the $dbh, and a rollback
1195 at any level of any transaction will cause the entire nested
1196 transaction to fail. Support for savepoints and for true nested
1197 transactions (for databases that support them) will hopefully be added
1198 in the future.
1199
1200 =head1 SQL
1201
1202 =head2 Creating Schemas From An Existing Database
1203
1204 L<DBIx::Class::Schema::Loader> will connect to a database and create a
1205 L<DBIx::Class::Schema> and associated sources by examining the database.
1206
1207 The recommend way of achieving this is to use the
1208 L<make_schema_at|DBIx::Class::Schema::Loader/make_schema_at> method:
1209
1210   perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib \
1211     -e 'make_schema_at("My::Schema", { debug => 1 }, [ "dbi:Pg:dbname=foo","postgres" ])'
1212
1213 This will create a tree of files rooted at C<./lib/My/Schema/> containing
1214 source definitions for all the tables found in the C<foo> database.
1215
1216 =head2 Creating DDL SQL
1217
1218 The following functionality requires you to have L<SQL::Translator>
1219 (also known as "SQL Fairy") installed.
1220
1221 To create a set of database-specific .sql files for the above schema:
1222
1223  my $schema = My::Schema->connect($dsn);
1224  $schema->create_ddl_dir(['MySQL', 'SQLite', 'PostgreSQL'],
1225                         '0.1',
1226                         './dbscriptdir/'
1227                         );
1228
1229 By default this will create schema files in the current directory, for
1230 MySQL, SQLite and PostgreSQL, using the $VERSION from your Schema.pm.
1231
1232 To create a new database using the schema:
1233
1234  my $schema = My::Schema->connect($dsn);
1235  $schema->deploy({ add_drop_tables => 1});
1236
1237 To import created .sql files using the mysql client:
1238
1239   mysql -h "host" -D "database" -u "user" -p < My_Schema_1.0_MySQL.sql
1240
1241 To create C<ALTER TABLE> conversion scripts to update a database to a
1242 newer version of your schema at a later point, first set a new
1243 C<$VERSION> in your Schema file, then:
1244
1245  my $schema = My::Schema->connect($dsn);
1246  $schema->create_ddl_dir(['MySQL', 'SQLite', 'PostgreSQL'],
1247                          '0.2',
1248                          '/dbscriptdir/',
1249                          '0.1'
1250                          );
1251
1252 This will produce new database-specific .sql files for the new version
1253 of the schema, plus scripts to convert from version 0.1 to 0.2. This
1254 requires that the files for 0.1 as created above are available in the
1255 given directory to diff against.
1256
1257 =head2 Select from dual
1258
1259 Dummy tables are needed by some databases to allow calling functions
1260 or expressions that aren't based on table content, for examples of how
1261 this applies to various database types, see:
1262 L<http://troels.arvin.dk/db/rdbms/#other-dummy_table>.
1263
1264 Note: If you're using Oracles dual table don't B<ever> do anything
1265 other than a select, if you CRUD on your dual table you *will* break
1266 your database.
1267
1268 Make a table class as you would for any other table
1269
1270   package MyAppDB::Dual;
1271   use strict;
1272   use warnings;
1273   use base 'DBIx::Class';
1274   __PACKAGE__->load_components("Core");
1275   __PACKAGE__->table("Dual");
1276   __PACKAGE__->add_columns(
1277     "dummy",
1278     { data_type => "VARCHAR2", is_nullable => 0, size => 1 },
1279   );
1280
1281 Once you've loaded your table class select from it using C<select>
1282 and C<as> instead of C<columns>
1283
1284   my $rs = $schema->resultset('Dual')->search(undef,
1285     { select => [ 'sydate' ],
1286       as     => [ 'now' ]
1287     },
1288   );
1289
1290 All you have to do now is be careful how you access your resultset, the below
1291 will not work because there is no column called 'now' in the Dual table class
1292
1293   while (my $dual = $rs->next) {
1294     print $dual->now."\n";
1295   }
1296   # Can't locate object method "now" via package "MyAppDB::Dual" at headshot.pl line 23.
1297
1298 You could of course use 'dummy' in C<as> instead of 'now', or C<add_columns> to
1299 your Dual class for whatever you wanted to select from dual, but that's just
1300 silly, instead use C<get_column>
1301
1302   while (my $dual = $rs->next) {
1303     print $dual->get_column('now')."\n";
1304   }
1305
1306 Or use C<cursor>
1307
1308   my $cursor = $rs->cursor;
1309   while (my @vals = $cursor->next) {
1310     print $vals[0]."\n";
1311   }
1312
1313 In case you're going to use this "trick" together with L<DBIx::Class::Schema/deploy> or
1314 L<DBIx::Class::Schema/create_ddl_dir> a table called "dual" will be created in your
1315 current schema. This would overlap "sys.dual" and you could not fetch "sysdate" or
1316 "sequence.nextval" anymore from dual. To avoid this problem, just tell
1317 L<SQL::Translator> to not create table dual:
1318
1319     my $sqlt_args = {
1320         add_drop_table => 1,
1321         parser_args    => { sources => [ grep $_ ne 'Dual', schema->sources ] },
1322     };
1323     $schema->create_ddl_dir( [qw/Oracle/], undef, './sql', undef, $sqlt_args );
1324
1325 Or use L<DBIx::Class::ResultClass::HashRefInflator>
1326
1327   $rs->result_class('DBIx::Class::ResultClass::HashRefInflator');
1328   while ( my $dual = $rs->next ) {
1329     print $dual->{now}."\n";
1330   }
1331
1332 Here are some example C<select> conditions to illustrate the different syntax
1333 you could use for doing stuff like
1334 C<oracles.heavily(nested(functions_can('take', 'lots'), OF), 'args')>
1335
1336   # get a sequence value
1337   select => [ 'A_SEQ.nextval' ],
1338
1339   # get create table sql
1340   select => [ { 'dbms_metadata.get_ddl' => [ "'TABLE'", "'ARTIST'" ]} ],
1341
1342   # get a random num between 0 and 100
1343   select => [ { "trunc" => [ { "dbms_random.value" => [0,100] } ]} ],
1344
1345   # what year is it?
1346   select => [ { 'extract' => [ \'year from sysdate' ] } ],
1347
1348   # do some math
1349   select => [ {'round' => [{'cos' => [ \'180 * 3.14159265359/180' ]}]}],
1350
1351   # which day of the week were you born on?
1352   select => [{'to_char' => [{'to_date' => [ "'25-DEC-1980'", "'dd-mon-yyyy'" ]}, "'day'"]}],
1353
1354   # select 16 rows from dual
1355   select   => [ "'hello'" ],
1356   as       => [ 'world' ],
1357   group_by => [ 'cube( 1, 2, 3, 4 )' ],
1358
1359
1360
1361 =head2 Adding Indexes And Functions To Your SQL
1362
1363 Often you will want indexes on columns on your table to speed up searching. To
1364 do this, create a method called C<sqlt_deploy_hook> in the relevant source
1365 class (refer to the advanced
1366 L<callback system|DBIx::Class::ResultSource/sqlt_deploy_callback> if you wish
1367 to share a hook between multiple sources):
1368
1369  package My::Schema::Result::Artist;
1370
1371  __PACKAGE__->table('artist');
1372  __PACKAGE__->add_columns(id => { ... }, name => { ... })
1373
1374  sub sqlt_deploy_hook {
1375    my ($self, $sqlt_table) = @_;
1376
1377    $sqlt_table->add_index(name => 'idx_name', fields => ['name']);
1378  }
1379
1380  1;
1381
1382 Sometimes you might want to change the index depending on the type of the
1383 database for which SQL is being generated:
1384
1385   my ($db_type = $sqlt_table->schema->translator->producer_type)
1386     =~ s/^SQL::Translator::Producer:://;
1387
1388 You can also add hooks to the schema level to stop certain tables being
1389 created:
1390
1391  package My::Schema;
1392
1393  ...
1394
1395  sub sqlt_deploy_hook {
1396    my ($self, $sqlt_schema) = @_;
1397
1398    $sqlt_schema->drop_table('table_name');
1399  }
1400
1401 You could also add views, procedures or triggers to the output using
1402 L<SQL::Translator::Schema/add_view>,
1403 L<SQL::Translator::Schema/add_procedure> or
1404 L<SQL::Translator::Schema/add_trigger>.
1405
1406
1407 =head2 Schema versioning
1408
1409 The following example shows simplistically how you might use DBIx::Class to
1410 deploy versioned schemas to your customers. The basic process is as follows:
1411
1412 =over 4
1413
1414 =item 1.
1415
1416 Create a DBIx::Class schema
1417
1418 =item 2.
1419
1420 Save the schema
1421
1422 =item 3.
1423
1424 Deploy to customers
1425
1426 =item 4.
1427
1428 Modify schema to change functionality
1429
1430 =item 5.
1431
1432 Deploy update to customers
1433
1434 =back
1435
1436 B<Create a DBIx::Class schema>
1437
1438 This can either be done manually, or generated from an existing database as
1439 described under L</Creating Schemas From An Existing Database>
1440
1441 B<Save the schema>
1442
1443 Call L<DBIx::Class::Schema/create_ddl_dir> as above under L</Creating DDL SQL>.
1444
1445 B<Deploy to customers>
1446
1447 There are several ways you could deploy your schema. These are probably
1448 beyond the scope of this recipe, but might include:
1449
1450 =over 4
1451
1452 =item 1.
1453
1454 Require customer to apply manually using their RDBMS.
1455
1456 =item 2.
1457
1458 Package along with your app, making database dump/schema update/tests
1459 all part of your install.
1460
1461 =back
1462
1463 B<Modify the schema to change functionality>
1464
1465 As your application evolves, it may be necessary to modify your schema
1466 to change functionality. Once the changes are made to your schema in
1467 DBIx::Class, export the modified schema and the conversion scripts as
1468 in L</Creating DDL SQL>.
1469
1470 B<Deploy update to customers>
1471
1472 Add the L<DBIx::Class::Schema::Versioned> schema component to your
1473 Schema class. This will add a new table to your database called
1474 C<dbix_class_schema_vesion> which will keep track of which version is installed
1475 and warn if the user trys to run a newer schema version than the
1476 database thinks it has.
1477
1478 Alternatively, you can send the conversion sql scripts to your
1479 customers as above.
1480
1481 =head2 Setting quoting for the generated SQL.
1482
1483 If the database contains column names with spaces and/or reserved words, they
1484 need to be quoted in the SQL queries. This is done using:
1485
1486  __PACKAGE__->storage->sql_maker->quote_char([ qw/[ ]/] );
1487  __PACKAGE__->storage->sql_maker->name_sep('.');
1488
1489 The first sets the quote characters. Either a pair of matching
1490 brackets, or a C<"> or C<'>:
1491
1492  __PACKAGE__->storage->sql_maker->quote_char('"');
1493
1494 Check the documentation of your database for the correct quote
1495 characters to use. C<name_sep> needs to be set to allow the SQL
1496 generator to put the quotes the correct place.
1497
1498 In most cases you should set these as part of the arguments passed to
1499 L<DBIx::Class::Schema/connect>:
1500
1501  my $schema = My::Schema->connect(
1502   'dbi:mysql:my_db',
1503   'db_user',
1504   'db_password',
1505   {
1506     quote_char => '"',
1507     name_sep   => '.'
1508   }
1509  )
1510
1511 =head2 Setting limit dialect for SQL::Abstract::Limit
1512
1513 In some cases, SQL::Abstract::Limit cannot determine the dialect of
1514 the remote SQL server by looking at the database handle. This is a
1515 common problem when using the DBD::JDBC, since the DBD-driver only
1516 know that in has a Java-driver available, not which JDBC driver the
1517 Java component has loaded.  This specifically sets the limit_dialect
1518 to Microsoft SQL-server (See more names in SQL::Abstract::Limit
1519 -documentation.
1520
1521   __PACKAGE__->storage->sql_maker->limit_dialect('mssql');
1522
1523 The JDBC bridge is one way of getting access to a MSSQL server from a platform
1524 that Microsoft doesn't deliver native client libraries for. (e.g. Linux)
1525
1526 The limit dialect can also be set at connect time by specifying a
1527 C<limit_dialect> key in the final hash as shown above.
1528
1529 =head2 Working with PostgreSQL array types
1530
1531 You can also assign values to PostgreSQL array columns by passing array
1532 references in the C<\%columns> (C<\%vals>) hashref of the
1533 L<DBIx::Class::ResultSet/create> and L<DBIx::Class::Row/update> family of
1534 methods:
1535
1536   $resultset->create({
1537     numbers => [1, 2, 3]
1538   });
1539
1540   $row->update(
1541     {
1542       numbers => [1, 2, 3]
1543     },
1544     {
1545       day => '2008-11-24'
1546     }
1547   );
1548
1549 In conditions (eg. C<\%cond> in the L<DBIx::Class::ResultSet/search> family of
1550 methods) you cannot directly use array references (since this is interpreted as
1551 a list of values to be C<OR>ed), but you can use the following syntax to force
1552 passing them as bind values:
1553
1554   $resultset->search(
1555     {
1556       numbers => \[ '= ?', [numbers => [1, 2, 3]] ]
1557     }
1558   );
1559
1560 See L<SQL::Abstract/array_datatypes> and L<SQL::Abstract/Literal SQL with
1561 placeholders and bind values (subqueries)> for more explanation. Note that
1562 L<DBIx::Class> sets L<SQL::Abstract/bindtype> to C<columns>, so you must pass
1563 the bind values (the C<[1, 2, 3]> arrayref in the above example) wrapped in
1564 arrayrefs together with the column name, like this: C<< [column_name => value]
1565 >>.
1566
1567 =head1 BOOTSTRAPPING/MIGRATING
1568
1569 =head2 Easy migration from class-based to schema-based setup
1570
1571 You want to start using the schema-based approach to L<DBIx::Class>
1572 (see L<SchemaIntro.pod>), but have an established class-based setup with lots
1573 of existing classes that you don't want to move by hand. Try this nifty script
1574 instead:
1575
1576   use MyDB;
1577   use SQL::Translator;
1578
1579   my $schema = MyDB->schema_instance;
1580
1581   my $translator           =  SQL::Translator->new(
1582       debug                => $debug          ||  0,
1583       trace                => $trace          ||  0,
1584       no_comments          => $no_comments    ||  0,
1585       show_warnings        => $show_warnings  ||  0,
1586       add_drop_table       => $add_drop_table ||  0,
1587       validate             => $validate       ||  0,
1588       parser_args          => {
1589          'DBIx::Schema'    => $schema,
1590                               },
1591       producer_args   => {
1592           'prefix'         => 'My::Schema',
1593                          },
1594   );
1595
1596   $translator->parser('SQL::Translator::Parser::DBIx::Class');
1597   $translator->producer('SQL::Translator::Producer::DBIx::Class::File');
1598
1599   my $output = $translator->translate(@args) or die
1600           "Error: " . $translator->error;
1601
1602   print $output;
1603
1604 You could use L<Module::Find> to search for all subclasses in the MyDB::*
1605 namespace, which is currently left as an exercise for the reader.
1606
1607 =head1 OVERLOADING METHODS
1608
1609 L<DBIx::Class> uses the L<Class::C3> package, which provides for redispatch of
1610 method calls, useful for things like default values and triggers. You have to
1611 use calls to C<next::method> to overload methods. More information on using
1612 L<Class::C3> with L<DBIx::Class> can be found in
1613 L<DBIx::Class::Manual::Component>.
1614
1615 =head2 Setting default values for a row
1616
1617 It's as simple as overriding the C<new> method.  Note the use of
1618 C<next::method>.
1619
1620   sub new {
1621     my ( $class, $attrs ) = @_;
1622
1623     $attrs->{foo} = 'bar' unless defined $attrs->{foo};
1624
1625     my $new = $class->next::method($attrs);
1626
1627     return $new;
1628   }
1629
1630 For more information about C<next::method>, look in the L<Class::C3>
1631 documentation. See also L<DBIx::Class::Manual::Component> for more
1632 ways to write your own base classes to do this.
1633
1634 People looking for ways to do "triggers" with DBIx::Class are probably
1635 just looking for this.
1636
1637 =head2 Changing one field whenever another changes
1638
1639 For example, say that you have three columns, C<id>, C<number>, and
1640 C<squared>.  You would like to make changes to C<number> and have
1641 C<squared> be automagically set to the value of C<number> squared.
1642 You can accomplish this by overriding C<store_column>:
1643
1644   sub store_column {
1645     my ( $self, $name, $value ) = @_;
1646     if ($name eq 'number') {
1647       $self->squared($value * $value);
1648     }
1649     $self->next::method($name, $value);
1650   }
1651
1652 Note that the hard work is done by the call to C<next::method>, which
1653 redispatches your call to store_column in the superclass(es).
1654
1655 =head2 Automatically creating related objects
1656
1657 You might have a class C<Artist> which has many C<CD>s.  Further, you
1658 want to create a C<CD> object every time you insert an C<Artist> object.
1659 You can accomplish this by overriding C<insert> on your objects:
1660
1661   sub insert {
1662     my ( $self, @args ) = @_;
1663     $self->next::method(@args);
1664     $self->cds->new({})->fill_from_artist($self)->insert;
1665     return $self;
1666   }
1667
1668 where C<fill_from_artist> is a method you specify in C<CD> which sets
1669 values in C<CD> based on the data in the C<Artist> object you pass in.
1670
1671 =head2 Wrapping/overloading a column accessor
1672
1673 B<Problem:>
1674
1675 Say you have a table "Camera" and want to associate a description
1676 with each camera. For most cameras, you'll be able to generate the description from
1677 the other columns. However, in a few special cases you may want to associate a
1678 custom description with a camera.
1679
1680 B<Solution:>
1681
1682 In your database schema, define a description field in the "Camera" table that
1683 can contain text and null values.
1684
1685 In DBIC, we'll overload the column accessor to provide a sane default if no
1686 custom description is defined. The accessor will either return or generate the
1687 description, depending on whether the field is null or not.
1688
1689 First, in your "Camera" schema class, define the description field as follows:
1690
1691   __PACKAGE__->add_columns(description => { accessor => '_description' });
1692
1693 Next, we'll define the accessor-wrapper subroutine:
1694
1695   sub description {
1696       my $self = shift;
1697
1698       # If there is an update to the column, we'll let the original accessor
1699       # deal with it.
1700       return $self->_description(@_) if @_;
1701
1702       # Fetch the column value.
1703       my $description = $self->_description;
1704
1705       # If there's something in the description field, then just return that.
1706       return $description if defined $description && length $descripton;
1707
1708       # Otherwise, generate a description.
1709       return $self->generate_description;
1710   }
1711
1712 =head1 DEBUGGING AND PROFILING
1713
1714 =head2 DBIx::Class objects with Data::Dumper
1715
1716 L<Data::Dumper> can be a very useful tool for debugging, but sometimes it can
1717 be hard to find the pertinent data in all the data it can generate.
1718 Specifically, if one naively tries to use it like so,
1719
1720   use Data::Dumper;
1721
1722   my $cd = $schema->resultset('CD')->find(1);
1723   print Dumper($cd);
1724
1725 several pages worth of data from the CD object's schema and result source will
1726 be dumped to the screen. Since usually one is only interested in a few column
1727 values of the object, this is not very helpful.
1728
1729 Luckily, it is possible to modify the data before L<Data::Dumper> outputs
1730 it. Simply define a hook that L<Data::Dumper> will call on the object before
1731 dumping it. For example,
1732
1733   package My::DB::CD;
1734
1735   sub _dumper_hook {
1736     $_[0] = bless {
1737       %{ $_[0] },
1738       result_source => undef,
1739     }, ref($_[0]);
1740   }
1741
1742   [...]
1743
1744   use Data::Dumper;
1745
1746   local $Data::Dumper::Freezer = '_dumper_hook';
1747
1748   my $cd = $schema->resultset('CD')->find(1);
1749   print Dumper($cd);
1750          # dumps $cd without its ResultSource
1751
1752 If the structure of your schema is such that there is a common base class for
1753 all your table classes, simply put a method similar to C<_dumper_hook> in the
1754 base class and set C<$Data::Dumper::Freezer> to its name and L<Data::Dumper>
1755 will automagically clean up your data before printing it. See
1756 L<Data::Dumper/EXAMPLES> for more information.
1757
1758 =head2 Profiling
1759
1760 When you enable L<DBIx::Class::Storage>'s debugging it prints the SQL
1761 executed as well as notifications of query completion and transaction
1762 begin/commit.  If you'd like to profile the SQL you can subclass the
1763 L<DBIx::Class::Storage::Statistics> class and write your own profiling
1764 mechanism:
1765
1766   package My::Profiler;
1767   use strict;
1768
1769   use base 'DBIx::Class::Storage::Statistics';
1770
1771   use Time::HiRes qw(time);
1772
1773   my $start;
1774
1775   sub query_start {
1776     my $self = shift();
1777     my $sql = shift();
1778     my $params = @_;
1779
1780     $self->print("Executing $sql: ".join(', ', @params)."\n");
1781     $start = time();
1782   }
1783
1784   sub query_end {
1785     my $self = shift();
1786     my $sql = shift();
1787     my @params = @_;
1788
1789     my $elapsed = sprintf("%0.4f", time() - $start);
1790     $self->print("Execution took $elapsed seconds.\n");
1791     $start = undef;
1792   }
1793
1794   1;
1795
1796 You can then install that class as the debugging object:
1797
1798   __PACKAGE__->storage->debugobj(new My::Profiler());
1799   __PACKAGE__->storage->debug(1);
1800
1801 A more complicated example might involve storing each execution of SQL in an
1802 array:
1803
1804   sub query_end {
1805     my $self = shift();
1806     my $sql = shift();
1807     my @params = @_;
1808
1809     my $elapsed = time() - $start;
1810     push(@{ $calls{$sql} }, {
1811         params => \@params,
1812         elapsed => $elapsed
1813     });
1814   }
1815
1816 You could then create average, high and low execution times for an SQL
1817 statement and dig down to see if certain parameters cause aberrant behavior.
1818 You might want to check out L<DBIx::Class::QueryLog> as well.
1819
1820 =head1 STARTUP SPEED
1821
1822 L<DBIx::Class|DBIx::Class> programs can have a significant startup delay
1823 as the ORM loads all the relevant classes. This section examines
1824 techniques for reducing the startup delay.
1825
1826 These tips are are listed in order of decreasing effectiveness - so the
1827 first tip, if applicable, should have the greatest effect on your
1828 application.
1829
1830 =head2 Statically Define Your Schema
1831
1832 If you are using
1833 L<DBIx::Class::Schema::Loader|DBIx::Class::Schema::Loader> to build the
1834 classes dynamically based on the database schema then there will be a
1835 significant startup delay.
1836
1837 For production use a statically defined schema (which can be generated
1838 using L<DBIx::Class::Schema::Loader|DBIx::Class::Schema::Loader> to dump
1839 the database schema once - see
1840 L<make_schema_at|DBIx::Class::Schema::Loader/make_schema_at> and
1841 L<dump_directory|DBIx::Class::Schema::Loader/dump_directory> for more
1842 details on creating static schemas from a database).
1843
1844 =head2 Move Common Startup into a Base Class
1845
1846 Typically L<DBIx::Class> result classes start off with
1847
1848     use base qw/DBIx::Class/;
1849     __PACKAGE__->load_components(qw/InflateColumn::DateTime Core/);
1850
1851 If this preamble is moved into a common base class:-
1852
1853     package MyDBICbase;
1854
1855     use base qw/DBIx::Class/;
1856     __PACKAGE__->load_components(qw/InflateColumn::DateTime Core/);
1857     1;
1858
1859 and each result class then uses this as a base:-
1860
1861     use base qw/MyDBICbase/;
1862
1863 then the load_components is only performed once, which can result in a
1864 considerable startup speedup for schemas with many classes.
1865
1866 =head2 Explicitly List Schema Result Classes
1867
1868 The schema class will normally contain
1869
1870     __PACKAGE__->load_classes();
1871
1872 to load the result classes. This will use L<Module::Find|Module::Find>
1873 to find and load the appropriate modules. Explicitly defining the
1874 classes you wish to load will remove the overhead of
1875 L<Module::Find|Module::Find> and the related directory operations:
1876
1877     __PACKAGE__->load_classes(qw/ CD Artist Track /);
1878
1879 If you are instead using the L<load_namespaces|DBIx::Class::Schema/load_namespaces>
1880 syntax to load the appropriate classes there is not a direct alternative
1881 avoiding L<Module::Find|Module::Find>.
1882
1883 =head1 MEMORY USAGE
1884
1885 =head2 Cached statements
1886
1887 L<DBIx::Class> normally caches all statements with L<< prepare_cached()|DBI/prepare_cached >>.
1888 This is normally a good idea, but if too many statements are cached, the database may use too much
1889 memory and may eventually run out and fail entirely.  If you suspect this may be the case, you may want
1890 to examine DBI's L<< CachedKids|DBI/CachedKidsCachedKids_(hash_ref) >> hash:
1891
1892     # print all currently cached prepared statements
1893     print for keys %{$schema->storage->dbh->{CachedKids}};
1894     # get a count of currently cached prepared statements
1895     my $count = scalar keys %{$schema->storage->dbh->{CachedKids}};
1896
1897 If it's appropriate, you can simply clear these statements, automatically deallocating them in the
1898 database:
1899
1900     my $kids = $schema->storage->dbh->{CachedKids};
1901     delete @{$kids}{keys %$kids} if scalar keys %$kids > 100;
1902
1903 But what you probably want is to expire unused statements and not those that are used frequently.
1904 You can accomplish this with L<Tie::Cache> or L<Tie::Cache::LRU>:
1905
1906     use Tie::Cache;
1907     use DB::Main;
1908     my $schema = DB::Main->connect($dbi_dsn, $user, $pass, {
1909         on_connect_do => sub { tie %{shift->_dbh->{CachedKids}}, 'Tie::Cache', 100 },
1910     });
1911
1912 =cut