1 package DBIx::Class::ResultSource;
6 use DBIx::Class::ResultSet;
7 use DBIx::Class::ResultSourceHandle;
8 use Carp::Clan qw/^DBIx::Class/;
11 use base qw/DBIx::Class/;
13 __PACKAGE__->mk_group_accessors('simple' => qw/_ordered_columns
14 _columns _primaries _unique_constraints name resultset_attributes
15 schema from _relationships column_info_from_storage source_info
18 __PACKAGE__->mk_group_accessors('component_class' => qw/resultset_class
23 DBIx::Class::ResultSource - Result source object
29 A ResultSource is a component of a schema from which results can be directly
30 retrieved, most usually a table (see L<DBIx::Class::ResultSource::Table>)
40 $class->new({attribute_name => value});
42 Creates a new ResultSource object. Not normally called directly by end users.
47 my ($class, $attrs) = @_;
48 $class = ref $class if ref $class;
50 my $new = bless { %{$attrs || {}} }, $class;
51 $new->{resultset_class} ||= 'DBIx::Class::ResultSet';
52 $new->{resultset_attributes} = { %{$new->{resultset_attributes} || {}} };
53 $new->{_ordered_columns} = [ @{$new->{_ordered_columns}||[]}];
54 $new->{_columns} = { %{$new->{_columns}||{}} };
55 $new->{_relationships} = { %{$new->{_relationships}||{}} };
56 $new->{name} ||= "!!NAME NOT SET!!";
57 $new->{_columns_info_loaded} ||= 0;
65 Stores a hashref of per-source metadata. No specific key names
66 have yet been standardized, the examples below are purely hypothetical
67 and don't actually accomplish anything on their own:
69 __PACKAGE__->source_info({
70 "_tablespace" => 'fast_disk_array_3',
71 "_engine" => 'InnoDB',
76 $table->add_columns(qw/col1 col2 col3/);
78 $table->add_columns('col1' => \%col1_info, 'col2' => \%col2_info, ...);
80 Adds columns to the result source. If supplied key => hashref pairs, uses
81 the hashref as the column_info for that column. Repeated calls of this
82 method will add more columns, not replace them.
84 The column names given will be created as accessor methods on your
85 L<DBIx::Class::Row> objects, you can change the name of the accessor
86 by supplying an L</accessor> in the column_info hash.
88 The contents of the column_info are not set in stone. The following
89 keys are currently recognised/used by DBIx::Class:
95 Use this to set the name of the accessor method for this column. If unset,
96 the name of the column will be used.
100 This contains the column type. It is automatically filled by the
101 L<SQL::Translator::Producer::DBIx::Class::File> producer, and the
102 L<DBIx::Class::Schema::Loader> module. If you do not enter a
103 data_type, DBIx::Class will attempt to retrieve it from the
104 database for you, using L<DBI>'s column_info method. The values of this
105 key are typically upper-cased.
107 Currently there is no standard set of values for the data_type. Use
108 whatever your database supports.
112 The length of your column, if it is a column type that can have a size
113 restriction. This is currently only used by L<DBIx::Class::Schema/deploy>.
117 Set this to a true value for a columns that is allowed to contain
118 NULL values. This is currently only used by L<DBIx::Class::Schema/deploy>.
120 =item is_auto_increment
122 Set this to a true value for a column whose value is somehow
123 automatically set. This is used to determine which columns to empty
124 when cloning objects using C<copy>. It is also used by
125 L<DBIx::Class::Schema/deploy>.
129 Set this to a true value for a column that contains a key from a
130 foreign table. This is currently only used by
131 L<DBIx::Class::Schema/deploy>.
135 Set this to the default value which will be inserted into a column
136 by the database. Can contain either a value or a function. This is
137 currently only used by L<DBIx::Class::Schema/deploy>.
141 Set this on a primary key column to the name of the sequence used to
142 generate a new key value. If not specified, L<DBIx::Class::PK::Auto>
143 will attempt to retrieve the name of the sequence from the database
148 Set this to a true value for a column whose value is retrieved
149 automatically from an oracle sequence. If you do not use an oracle
150 trigger to get the nextval, you have to set sequence as well.
154 This is used by L<DBIx::Class::Schema/deploy> and L<SQL::Translator>
155 to add extra non-generic data to the column. For example: C<< extra
156 => { unsigned => 1} >> is used by the MySQL producer to set an integer
157 column to unsigned. For more details, see
158 L<SQL::Translator::Producer::MySQL>.
164 $table->add_column('col' => \%info?);
166 Convenience alias to add_columns.
171 my ($self, @cols) = @_;
172 $self->_ordered_columns(\@cols) unless $self->_ordered_columns;
175 my $columns = $self->_columns;
176 while (my $col = shift @cols) {
177 # If next entry is { ... } use that for the column info, if not
178 # use an empty hashref
179 my $column_info = ref $cols[0] ? shift(@cols) : {};
180 push(@added, $col) unless exists $columns->{$col};
181 $columns->{$col} = $column_info;
183 push @{ $self->_ordered_columns }, @added;
187 sub add_column { shift->add_columns(@_); } # DO NOT CHANGE THIS TO GLOB
191 if ($obj->has_column($col)) { ... }
193 Returns true if the source has a column of this name, false otherwise.
198 my ($self, $column) = @_;
199 return exists $self->_columns->{$column};
204 my $info = $obj->column_info($col);
206 Returns the column metadata hashref for a column. See the description
207 of add_column for information on the contents of the hashref.
212 my ($self, $column) = @_;
213 $self->throw_exception("No such column $column")
214 unless exists $self->_columns->{$column};
215 #warn $self->{_columns_info_loaded}, "\n";
216 if ( ! $self->_columns->{$column}{data_type}
217 and $self->column_info_from_storage
218 and ! $self->{_columns_info_loaded}
219 and $self->schema and $self->storage )
221 $self->{_columns_info_loaded}++;
224 # eval for the case of storage without table
225 eval { $info = $self->storage->columns_info_for( $self->from ) };
227 for my $realcol ( keys %{$info} ) {
228 $lc_info->{lc $realcol} = $info->{$realcol};
230 foreach my $col ( keys %{$self->_columns} ) {
231 $self->_columns->{$col} = {
232 %{ $self->_columns->{$col} },
233 %{ $info->{$col} || $lc_info->{lc $col} || {} }
238 return $self->_columns->{$column};
241 =head2 column_info_from_storage
243 Enables the on-demand automatic loading of the above column
244 metadata from storage as neccesary. This is *deprecated*, and
245 should not be used. It will be removed before 1.0.
247 __PACKAGE__->column_info_from_storage(1);
251 my @column_names = $obj->columns;
253 Returns all column names in the order they were declared to add_columns.
259 $self->throw_exception(
260 "columns() is a read-only accessor, did you mean add_columns()?"
262 return @{$self->{_ordered_columns}||[]};
265 =head2 remove_columns
267 $table->remove_columns(qw/col1 col2 col3/);
269 Removes columns from the result source.
273 $table->remove_column('col');
275 Convenience alias to remove_columns.
280 my ($self, @cols) = @_;
282 return unless $self->_ordered_columns;
284 my $columns = $self->_columns;
287 foreach my $col (@{$self->_ordered_columns}) {
288 push @remaining, $col unless grep(/$col/, @cols);
292 delete $columns->{$_};
295 $self->_ordered_columns(\@remaining);
298 sub remove_column { shift->remove_columns(@_); } # DO NOT CHANGE THIS TO GLOB
300 =head2 set_primary_key
304 =item Arguments: @cols
308 Defines one or more columns as primary key for this source. Should be
309 called after C<add_columns>.
311 Additionally, defines a unique constraint named C<primary>.
313 The primary key columns are used by L<DBIx::Class::PK::Auto> to
314 retrieve automatically created values from the database.
318 sub set_primary_key {
319 my ($self, @cols) = @_;
320 # check if primary key columns are valid columns
321 foreach my $col (@cols) {
322 $self->throw_exception("No such column $col on table " . $self->name)
323 unless $self->has_column($col);
325 $self->_primaries(\@cols);
327 $self->add_unique_constraint(primary => \@cols);
330 =head2 primary_columns
332 Read-only accessor which returns the list of primary keys.
336 sub primary_columns {
337 return @{shift->_primaries||[]};
340 =head2 add_unique_constraint
342 Declare a unique constraint on this source. Call once for each unique
345 # For UNIQUE (column1, column2)
346 __PACKAGE__->add_unique_constraint(
347 constraint_name => [ qw/column1 column2/ ],
350 Alternatively, you can specify only the columns:
352 __PACKAGE__->add_unique_constraint([ qw/column1 column2/ ]);
354 This will result in a unique constraint named C<table_column1_column2>, where
355 C<table> is replaced with the table name.
357 Unique constraints are used, for example, when you call
358 L<DBIx::Class::ResultSet/find>. Only columns in the constraint are searched.
362 sub add_unique_constraint {
367 $name ||= $self->name_unique_constraint($cols);
369 foreach my $col (@$cols) {
370 $self->throw_exception("No such column $col on table " . $self->name)
371 unless $self->has_column($col);
374 my %unique_constraints = $self->unique_constraints;
375 $unique_constraints{$name} = $cols;
376 $self->_unique_constraints(\%unique_constraints);
379 =head2 name_unique_constraint
381 Return a name for a unique constraint containing the specified columns. These
382 names consist of the table name and each column name, separated by underscores.
384 For example, a constraint on a table named C<cd> containing the columns
385 C<artist> and C<title> would result in a constraint name of C<cd_artist_title>.
389 sub name_unique_constraint {
390 my ($self, $cols) = @_;
392 return join '_', $self->name, @$cols;
395 =head2 unique_constraints
397 Read-only accessor which returns the list of unique constraints on this source.
401 sub unique_constraints {
402 return %{shift->_unique_constraints||{}};
405 =head2 unique_constraint_names
407 Returns the list of unique constraint names defined on this source.
411 sub unique_constraint_names {
414 my %unique_constraints = $self->unique_constraints;
416 return keys %unique_constraints;
419 =head2 unique_constraint_columns
421 Returns the list of columns that make up the specified unique constraint.
425 sub unique_constraint_columns {
426 my ($self, $constraint_name) = @_;
428 my %unique_constraints = $self->unique_constraints;
430 $self->throw_exception(
431 "Unknown unique constraint $constraint_name on '" . $self->name . "'"
432 ) unless exists $unique_constraints{$constraint_name};
434 return @{ $unique_constraints{$constraint_name} };
439 Returns an expression of the source to be supplied to storage to specify
440 retrieval from this source. In the case of a database, the required FROM
445 Returns the L<DBIx::Class::Schema> object that this result source
450 Returns the storage handle for the current schema.
452 See also: L<DBIx::Class::Storage>
456 sub storage { shift->schema->storage; }
458 =head2 add_relationship
460 $source->add_relationship('relname', 'related_source', $cond, $attrs);
462 The relationship name can be arbitrary, but must be unique for each
463 relationship attached to this result source. 'related_source' should
464 be the name with which the related result source was registered with
465 the current schema. For example:
467 $schema->source('Book')->add_relationship('reviews', 'Review', {
468 'foreign.book_id' => 'self.id',
471 The condition C<$cond> needs to be an L<SQL::Abstract>-style
472 representation of the join between the tables. For example, if you're
473 creating a rel from Author to Book,
475 { 'foreign.author_id' => 'self.id' }
477 will result in the JOIN clause
479 author me JOIN book foreign ON foreign.author_id = me.id
481 You can specify as many foreign => self mappings as necessary.
483 Valid attributes are as follows:
489 Explicitly specifies the type of join to use in the relationship. Any
490 SQL join type is valid, e.g. C<LEFT> or C<RIGHT>. It will be placed in
491 the SQL command immediately before C<JOIN>.
495 An arrayref containing a list of accessors in the foreign class to proxy in
496 the main class. If, for example, you do the following:
498 CD->might_have(liner_notes => 'LinerNotes', undef, {
499 proxy => [ qw/notes/ ],
502 Then, assuming LinerNotes has an accessor named notes, you can do:
504 my $cd = CD->find(1);
505 # set notes -- LinerNotes object is created if it doesn't exist
506 $cd->notes('Notes go here');
510 Specifies the type of accessor that should be created for the
511 relationship. Valid values are C<single> (for when there is only a single
512 related object), C<multi> (when there can be many), and C<filter> (for
513 when there is a single related object, but you also want the relationship
514 accessor to double as a column accessor). For C<multi> accessors, an
515 add_to_* method is also created, which calls C<create_related> for the
522 sub add_relationship {
523 my ($self, $rel, $f_source_name, $cond, $attrs) = @_;
524 $self->throw_exception("Can't create relationship without join condition")
528 # Check foreign and self are right in cond
529 if ( (ref $cond ||'') eq 'HASH') {
531 $self->throw_exception("Keys of condition should be of form 'foreign.col', not '$_'")
532 if /\./ && !/^foreign\./;
536 my %rels = %{ $self->_relationships };
537 $rels{$rel} = { class => $f_source_name,
538 source => $f_source_name,
541 $self->_relationships(\%rels);
545 # XXX disabled. doesn't work properly currently. skip in tests.
547 my $f_source = $self->schema->source($f_source_name);
549 $self->ensure_class_loaded($f_source_name);
550 $f_source = $f_source_name->result_source;
551 #my $s_class = ref($self->schema);
552 #$f_source_name =~ m/^${s_class}::(.*)$/;
553 #$self->schema->register_class(($1 || $f_source_name), $f_source_name);
554 #$f_source = $self->schema->source($f_source_name);
556 return unless $f_source; # Can't test rel without f_source
558 eval { $self->resolve_join($rel, 'me') };
560 if ($@) { # If the resolve failed, back out and re-throw the error
561 delete $rels{$rel}; #
562 $self->_relationships(\%rels);
563 $self->throw_exception("Error creating relationship $rel: $@");
570 Returns all relationship names for this source.
575 return keys %{shift->_relationships};
578 =head2 relationship_info
582 =item Arguments: $relname
586 Returns a hash of relationship information for the specified relationship
591 sub relationship_info {
592 my ($self, $rel) = @_;
593 return $self->_relationships->{$rel};
596 =head2 has_relationship
600 =item Arguments: $rel
604 Returns true if the source has a relationship of this name, false otherwise.
608 sub has_relationship {
609 my ($self, $rel) = @_;
610 return exists $self->_relationships->{$rel};
613 =head2 reverse_relationship_info
617 =item Arguments: $relname
621 Returns an array of hash references of relationship information for
622 the other side of the specified relationship name.
626 sub reverse_relationship_info {
627 my ($self, $rel) = @_;
628 my $rel_info = $self->relationship_info($rel);
631 return $ret unless ((ref $rel_info->{cond}) eq 'HASH');
633 my @cond = keys(%{$rel_info->{cond}});
634 my @refkeys = map {/^\w+\.(\w+)$/} @cond;
635 my @keys = map {$rel_info->{cond}->{$_} =~ /^\w+\.(\w+)$/} @cond;
637 # Get the related result source for this relationship
638 my $othertable = $self->related_source($rel);
640 # Get all the relationships for that source that related to this source
641 # whose foreign column set are our self columns on $rel and whose self
642 # columns are our foreign columns on $rel.
643 my @otherrels = $othertable->relationships();
644 my $otherrelationship;
645 foreach my $otherrel (@otherrels) {
646 my $otherrel_info = $othertable->relationship_info($otherrel);
648 my $back = $othertable->related_source($otherrel);
649 next unless $back->source_name eq $self->source_name;
653 if (ref $otherrel_info->{cond} eq 'HASH') {
654 @othertestconds = ($otherrel_info->{cond});
656 elsif (ref $otherrel_info->{cond} eq 'ARRAY') {
657 @othertestconds = @{$otherrel_info->{cond}};
663 foreach my $othercond (@othertestconds) {
664 my @other_cond = keys(%$othercond);
665 my @other_refkeys = map {/^\w+\.(\w+)$/} @other_cond;
666 my @other_keys = map {$othercond->{$_} =~ /^\w+\.(\w+)$/} @other_cond;
667 next if (!$self->compare_relationship_keys(\@refkeys, \@other_keys) ||
668 !$self->compare_relationship_keys(\@other_refkeys, \@keys));
669 $ret->{$otherrel} = $otherrel_info;
675 =head2 compare_relationship_keys
679 =item Arguments: $keys1, $keys2
683 Returns true if both sets of keynames are the same, false otherwise.
687 sub compare_relationship_keys {
688 my ($self, $keys1, $keys2) = @_;
690 # Make sure every keys1 is in keys2
692 foreach my $key (@$keys1) {
694 foreach my $prim (@$keys2) {
703 # Make sure every key2 is in key1
705 foreach my $prim (@$keys2) {
707 foreach my $key (@$keys1) {
724 =item Arguments: $relation
728 Returns the join structure required for the related result source.
733 my ($self, $join, $alias, $seen, $force_left) = @_;
735 $force_left ||= { force => 0 };
736 if (ref $join eq 'ARRAY') {
737 return map { $self->resolve_join($_, $alias, $seen) } @$join;
738 } elsif (ref $join eq 'HASH') {
741 my $as = ($seen->{$_} ? $_.'_'.($seen->{$_}+1) : $_);
742 local $force_left->{force};
744 $self->resolve_join($_, $alias, $seen, $force_left),
745 $self->related_source($_)->resolve_join(
746 $join->{$_}, $as, $seen, $force_left
750 } elsif (ref $join) {
751 $self->throw_exception("No idea how to resolve join reftype ".ref $join);
753 my $count = ++$seen->{$join};
754 #use Data::Dumper; warn Dumper($seen);
755 my $as = ($count > 1 ? "${join}_${count}" : $join);
756 my $rel_info = $self->relationship_info($join);
757 $self->throw_exception("No such relationship ${join}") unless $rel_info;
759 if ($force_left->{force}) {
762 $type = $rel_info->{attrs}{join_type} || '';
763 $force_left->{force} = 1 if lc($type) eq 'left';
765 return [ { $as => $self->related_source($join)->from,
766 -join_type => $type },
767 $self->resolve_condition($rel_info->{cond}, $as, $alias) ];
771 =head2 resolve_condition
775 =item Arguments: $cond, $as, $alias|$object
779 Resolves the passed condition to a concrete query fragment. If given an alias,
780 returns a join condition; if given an object, inverts that object to produce
781 a related conditional from that object.
785 sub resolve_condition {
786 my ($self, $cond, $as, $for) = @_;
788 if (ref $cond eq 'HASH') {
790 foreach my $k (keys %{$cond}) {
792 # XXX should probably check these are valid columns
793 $k =~ s/^foreign\.// ||
794 $self->throw_exception("Invalid rel cond key ${k}");
796 $self->throw_exception("Invalid rel cond val ${v}");
797 if (ref $for) { # Object
798 #warn "$self $k $for $v";
799 $ret{$k} = $for->get_column($v) if $for->has_column_loaded($v);
801 } elsif (!defined $for) { # undef, i.e. "no object"
803 } elsif (ref $as eq 'HASH') { # reverse hashref
804 $ret{$v} = $as->{$k};
805 } elsif (ref $as) { # reverse object
806 $ret{$v} = $as->get_column($k);
807 } elsif (!defined $as) { # undef, i.e. "no reverse object"
810 $ret{"${as}.${k}"} = "${for}.${v}";
814 } elsif (ref $cond eq 'ARRAY') {
815 return [ map { $self->resolve_condition($_, $as, $for) } @$cond ];
817 die("Can't handle this yet :(");
821 =head2 resolve_prefetch
825 =item Arguments: hashref/arrayref/scalar
829 Accepts one or more relationships for the current source and returns an
830 array of column names for each of those relationships. Column names are
831 prefixed relative to the current source, in accordance with where they appear
832 in the supplied relationships. Examples:
834 my $source = $schema->resultset('Tag')->source;
835 @columns = $source->resolve_prefetch( { cd => 'artist' } );
843 # 'cd.artist.artistid',
847 @columns = $source->resolve_prefetch( qw[/ cd /] );
857 $source = $schema->resultset('CD')->source;
858 @columns = $source->resolve_prefetch( qw[/ artist producer /] );
864 # 'producer.producerid',
870 sub resolve_prefetch {
871 my ($self, $pre, $alias, $seen, $order, $collapse) = @_;
873 #$alias ||= $self->name;
874 #warn $alias, Dumper $pre;
875 if( ref $pre eq 'ARRAY' ) {
877 map { $self->resolve_prefetch( $_, $alias, $seen, $order, $collapse ) }
880 elsif( ref $pre eq 'HASH' ) {
883 $self->resolve_prefetch($_, $alias, $seen, $order, $collapse),
884 $self->related_source($_)->resolve_prefetch(
885 $pre->{$_}, "${alias}.$_", $seen, $order, $collapse)
891 $self->throw_exception(
892 "don't know how to resolve prefetch reftype ".ref($pre));
895 my $count = ++$seen->{$pre};
896 my $as = ($count > 1 ? "${pre}_${count}" : $pre);
897 my $rel_info = $self->relationship_info( $pre );
898 $self->throw_exception( $self->name . " has no such relationship '$pre'" )
900 my $as_prefix = ($alias =~ /^.*?\.(.+)$/ ? $1.'.' : '');
901 my $rel_source = $self->related_source($pre);
903 if (exists $rel_info->{attrs}{accessor}
904 && $rel_info->{attrs}{accessor} eq 'multi') {
905 $self->throw_exception(
906 "Can't prefetch has_many ${pre} (join cond too complex)")
907 unless ref($rel_info->{cond}) eq 'HASH';
908 my $dots = @{[$as_prefix =~ m/\./g]} + 1; # +1 to match the ".${as_prefix}"
909 if (my ($fail) = grep { @{[$_ =~ m/\./g]} == $dots }
911 my ($last) = ($fail =~ /([^\.]+)$/);
912 $self->throw_exception(
913 "Can't prefetch multiple has_many rels ${last} and ${pre}"
914 .(length($as_prefix) ? "at the same level (${as_prefix})"
918 #my @col = map { (/^self\.(.+)$/ ? ("${as_prefix}.$1") : ()); }
919 # values %{$rel_info->{cond}};
920 $collapse->{".${as_prefix}${pre}"} = [ $rel_source->primary_columns ];
921 # action at a distance. prepending the '.' allows simpler code
922 # in ResultSet->_collapse_result
923 my @key = map { (/^foreign\.(.+)$/ ? ($1) : ()); }
924 keys %{$rel_info->{cond}};
925 my @ord = (ref($rel_info->{attrs}{order_by}) eq 'ARRAY'
926 ? @{$rel_info->{attrs}{order_by}}
927 : (defined $rel_info->{attrs}{order_by}
928 ? ($rel_info->{attrs}{order_by})
930 push(@$order, map { "${as}.$_" } (@key, @ord));
933 return map { [ "${as}.$_", "${as_prefix}${pre}.$_", ] }
934 $rel_source->columns;
935 #warn $alias, Dumper (\@ret);
940 =head2 related_source
944 =item Arguments: $relname
948 Returns the result source object for the given relationship.
953 my ($self, $rel) = @_;
954 if( !$self->has_relationship( $rel ) ) {
955 $self->throw_exception("No such relationship '$rel'");
957 return $self->schema->source($self->relationship_info($rel)->{source});
964 =item Arguments: $relname
968 Returns the class name for objects in the given relationship.
973 my ($self, $rel) = @_;
974 if( !$self->has_relationship( $rel ) ) {
975 $self->throw_exception("No such relationship '$rel'");
977 return $self->schema->class($self->relationship_info($rel)->{source});
982 Returns a resultset for the given source. This will initially be created
985 $self->resultset_class->new($self, $self->resultset_attributes)
987 but is cached from then on unless resultset_class changes.
989 =head2 resultset_class
991 ` package My::ResultSetClass;
992 use base 'DBIx::Class::ResultSet';
995 $source->resultset_class('My::ResultSet::Class');
997 Set the class of the resultset, this is useful if you want to create your
998 own resultset methods. Create your own class derived from
999 L<DBIx::Class::ResultSet>, and set it here. If called with no arguments,
1000 this method returns the name of the existing resultset class, if one
1003 =head2 resultset_attributes
1005 $source->resultset_attributes({ order_by => [ 'id' ] });
1007 Specify here any attributes you wish to pass to your specialised
1008 resultset. For a full list of these, please see
1009 L<DBIx::Class::ResultSet/ATTRIBUTES>.
1015 $self->throw_exception(
1016 'resultset does not take any arguments. If you want another resultset, '.
1017 'call it on the schema instead.'
1020 return $self->resultset_class->new(
1023 %{$self->{resultset_attributes}},
1024 %{$self->schema->default_resultset_attributes}
1033 =item Arguments: $source_name
1037 Set the name of the result source when it is loaded into a schema.
1038 This is usefull if you want to refer to a result source by a name other than
1041 package ArchivedBooks;
1042 use base qw/DBIx::Class/;
1043 __PACKAGE__->table('books_archive');
1044 __PACKAGE__->source_name('Books');
1046 # from your schema...
1047 $schema->resultset('Books')->find(1);
1051 Obtain a new handle to this source. Returns an instance of a
1052 L<DBIx::Class::ResultSourceHandle>.
1057 return new DBIx::Class::ResultSourceHandle({
1058 schema => $_[0]->schema,
1059 source_moniker => $_[0]->source_name
1063 =head2 throw_exception
1065 See L<DBIx::Class::Schema/"throw_exception">.
1069 sub throw_exception {
1071 if (defined $self->schema) {
1072 $self->schema->throw_exception(@_);
1078 =head2 sqlt_deploy_hook($sqlt_table)
1080 An optional sub which you can declare in your own Schema class that will get
1081 passed the L<SQL::Translator::Schema::Table> object when you deploy the schema
1082 via L</create_ddl_dir> or L</deploy>.
1084 For an example of what you can do with this, see
1085 L<DBIx::Class::Manual::Cookbook/Adding Indexes And Functions To Your SQL>.
1089 Matt S. Trout <mst@shadowcatsystems.co.uk>
1093 You may distribute this code under the same terms as Perl itself.