Add search_rs to ResultSet and a new {$rel}_rs accessor to has_many.
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship.pm
1 package DBIx::Class::Relationship;
2
3 use strict;
4 use warnings;
5
6 use base qw/DBIx::Class/;
7
8 __PACKAGE__->load_own_components(qw/
9   Helpers
10   Accessor
11   CascadeActions
12   ProxyMethods
13   Base
14 /);
15
16 =head1 NAME
17
18 DBIx::Class::Relationship - Inter-table relationships
19
20 =head1 SYNOPSIS
21
22   MyDB::Schema::Actor->has_many('actorroles' => 'MyDB::Schema::ActorRole',
23                                 'actor');
24   MyDB::Schema::Role->has_many('actorroles' => 'MyDB::Schema::ActorRole',
25                                 'role');
26   MyDB::Schema::ActorRole->belongs_to('role' => 'MyDB::Schema::Role');
27   MyDB::Schema::ActorRole->belongs_to('actor' => 'MyDB::Schema::Actor');
28
29   MyDB::Schema::Role->many_to_many('actors' => 'actorroles', 'actor');
30   MyDB::Schema::Actor->many_to_many('roles' => 'actorroles', 'role');
31
32   $schema->resultset('Actor')->roles();
33   $schema->resultset('Role')->search_related('actors', { Name => 'Fred' });
34   $schema->resultset('ActorRole')->add_to_roles({ Name => 'Sherlock Holmes'});
35
36 See L<DBIx::Class::Manual::Cookbook> for more.
37
38 =head1 DESCRIPTION
39
40 This class provides methods to set up relationships between the tables
41 in your database model. Relationships are the most useful and powerful
42 technique that L<DBIx::Class> provides. To create efficient database queries,
43 create relationships between any and all tables that have something in
44 common, for example if you have a table Authors:
45
46   ID  | Name | Age
47  ------------------
48    1  | Fred | 30
49    2  | Joe  | 32
50
51 and a table Books:
52
53   ID  | Author | Name
54  --------------------
55    1  |      1 | Rulers of the universe
56    2  |      1 | Rulers of the galaxy
57
58 Then without relationships, the method of getting all books by Fred goes like
59 this:
60
61  my $fred = $schema->resultset('Author')->find({ Name => 'Fred' });
62  my $fredsbooks = $schema->resultset('Book')->search({ Author => $fred->ID });
63 With a has_many relationship called "books" on Author (see below for details),
64 we can do this instead:
65
66  my $fredsbooks = $schema->resultset('Author')->find({ Name => 'Fred' })->books;
67
68 Each relationship sets up an accessor method on the
69 L<DBIx::Class::Manual::Glossary/"Row"> objects that represent the items
70 of your table. From L<DBIx::Class::Manual::Glossary/"ResultSet"> objects,
71 the relationships can be searched using the "search_related" method.
72 In list context, each returns a list of Row objects for the related class,
73 in scalar context, a new ResultSet representing the joined tables is
74 returned. Thus, the calls can be chained to produce complex queries.
75 Since the database is not actually queried until you attempt to retrieve
76 the data for an actual item, no time is wasted producing them.
77
78  my $cheapfredbooks = $schema->resultset('Author')->find({
79    Name => 'Fred',
80  })->books->search_related('prices', {
81    Price => { '<=' => '5.00' },
82  });
83
84 will produce a query something like:
85
86  SELECT * FROM Author me
87  LEFT JOIN Books books ON books.author = me.id
88  LEFT JOIN Prices prices ON prices.book = books.id
89  WHERE prices.Price <= 5.00
90
91 all without needing multiple fetches.
92
93 Only the helper methods for setting up standard relationship types
94 are documented here. For the basic, lower-level methods, and a description
95 of all the useful *_related methods that you get for free, see
96 L<DBIx::Class::Relationship::Base>.
97
98 =head1 METHODS
99
100 All helper methods take the following arguments:
101
102   __PACKAGE__>$method_name('relname', 'Foreign::Class', $cond, $attrs);
103   
104 Both C<$cond> and C<$attrs> are optional. Pass C<undef> for C<$cond> if
105 you want to use the default value for it, but still want to set C<$attrs>.
106 See L<DBIx::Class::Relationship::Base> for a list of valid attributes.
107
108 =head2 belongs_to
109
110   # in a Book class (where Author has many Books)
111   My::DBIC::Schema::Book->belongs_to(author => 'My::DBIC::Schema::Author');
112   my $author_obj = $obj->author;
113   $obj->author($new_author_obj);
114
115 Creates a relationship where the calling class stores the foreign class's
116 primary key in one (or more) of its columns. If $cond is a column name
117 instead of a join condition hash, that is used as the name of the column
118 holding the foreign key. If $cond is not given, the relname is used as
119 the column name.
120
121 NOTE: If you are used to L<Class::DBI> relationships, this is the equivalent
122 of C<has_a>.
123
124 =head2 has_many
125
126   # in an Author class (where Author has many Books)
127   My::DBIC::Schema::Author->has_many(books => 'My::DBIC::Schema::Book', 'author');
128   my $booklist = $obj->books;
129   my $booklist = $obj->books({
130     name => { LIKE => '%macaroni%' },
131     { prefetch => [qw/book/],
132   });
133   my @book_objs = $obj->books;
134   my $books_rs = $obj->books;
135   ( $books_rs ) = $obj->books_rs;
136
137   $obj->add_to_books(\%col_data);
138
139 Creates a one-to-many relationship, where the corresponding elements of the
140 foreign class store the calling class's primary key in one (or more) of its
141 columns. You should pass the name of the column in the foreign class as the
142 $cond argument, or specify a complete join condition.
143
144 Three methods are created when you create a has_many relationship.  The first 
145 method is the expected accessor method.  The second is almost exactly the same 
146 as the accessor method but "_rs" is added to the end of the method name.  This 
147 method works just like the normal accessor, except that it returns a resultset 
148 no matter what, even in list context. The third method, named 
149 C<< add_to_<relname> >>, will also be added to your Row items, this allows 
150 you to insert new related items, using the same mechanism as in 
151 L<DBIx::Class::Relationship::Base/"create_related">.
152
153 If you delete an object in a class with a C<has_many> relationship, all
154 related objects will be deleted as well. However, any database-level
155 cascade or restrict will take precedence.
156
157 =head2 might_have
158
159   My::DBIC::Schema::Author->might_have(pseudonym =>
160                                        'My::DBIC::Schema::Pseudonyms');
161   my $pname = $obj->pseudonym; # to get the Pseudonym object
162
163 Creates an optional one-to-one relationship with a class, where the foreign
164 class stores our primary key in one of its columns. Defaults to the primary
165 key of the foreign class unless $cond specifies a column or join condition.
166
167 If you update or delete an object in a class with a C<might_have>
168 relationship, the related object will be updated or deleted as well.
169 Any database-level update or delete constraints will override this behaviour.
170
171 =head2 has_one
172
173   My::DBIC::Schema::Book->has_one(isbn => 'My::DBIC::Schema::ISBN');
174   my $isbn_obj = $obj->isbn;
175
176 Creates a one-to-one relationship with another class. This is just like
177 C<might_have>, except the implication is that the other object is always
178 present. The only difference between C<has_one> and C<might_have> is that
179 C<has_one> uses an (ordinary) inner join, whereas C<might_have> uses a
180 left join.
181
182
183 =head2 many_to_many
184
185   My::DBIC::Schema::Actor->has_many( actor_roles =>
186                                      'My::DBIC::Schema::ActorRoles',
187                                      'actor' );
188   My::DBIC::Schema::ActorRoles->belongs_to( role =>
189                                             'My::DBIC::Schema::Role' );
190   My::DBIC::Schema::ActorRoles->belongs_to( actor =>
191                                             'My::DBIC::Schema::Actor' );
192
193   My::DBIC::Schema::Actor->many_to_many( roles => 'actor_roles',
194                                          'role' );
195
196   ...
197
198   my @role_objs = $actor->roles;
199
200 Creates an accessor bridging two relationships; not strictly a relationship
201 in its own right, although the accessor will return a resultset or collection
202 of objects just as a has_many would.
203 To use many_to_many, existing relationships from the original table to the link
204 table, and from the link table to the end table must already exist, these
205 relation names are then used in the many_to_many call.
206
207 =cut
208
209 1;
210
211 =head1 AUTHORS
212
213 Matt S. Trout <mst@shadowcatsystems.co.uk>
214
215 =head1 LICENSE
216
217 You may distribute this code under the same terms as Perl itself.
218
219 =cut
220