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