added some advice to debugging replicants so that we can see a replicant dsn, got...
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship.pm
CommitLineData
b8e1e21f 1package DBIx::Class::Relationship;
2
3use strict;
4use warnings;
5
1edd1722 6use base qw/DBIx::Class/;
55e2d745 7
07037f89 8__PACKAGE__->load_own_components(qw/
7411204b 9 Helpers
07037f89 10 Accessor
11 CascadeActions
12 ProxyMethods
13 Base
14/);
b8e1e21f 15
75d07914 16=head1 NAME
34d52be2 17
18DBIx::Class::Relationship - Inter-table relationships
19
20=head1 SYNOPSIS
21
75d07914 22 MyDB::Schema::Actor->has_many('actorroles' => 'MyDB::Schema::ActorRole',
d2113a68 23 'actor');
75d07914 24 MyDB::Schema::Role->has_many('actorroles' => 'MyDB::Schema::ActorRole',
d2113a68 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' });
fca27358 34 $schema->resultset('ActorRole')->add_to_roles({ Name => 'Sherlock Holmes'});
d2113a68 35
36See L<DBIx::Class::Manual::Cookbook> for more.
37
34d52be2 38=head1 DESCRIPTION
39
bc1171c3 40This class provides methods to set up relationships between the tables
41in your database model. Relationships are the most useful and powerful
42technique that L<DBIx::Class> provides. To create efficient database queries,
43create relationships between any and all tables that have something in
44common, for example if you have a table Authors:
45
46 ID | Name | Age
47 ------------------
48 1 | Fred | 30
49 2 | Joe | 32
50
51and a table Books:
52
53 ID | Author | Name
54 --------------------
55 1 | 1 | Rulers of the universe
56 2 | 1 | Rulers of the galaxy
57
58Then without relationships, the method of getting all books by Fred goes like
59this:
60
61 my $fred = $schema->resultset('Author')->find({ Name => 'Fred' });
62 my $fredsbooks = $schema->resultset('Book')->search({ Author => $fred->ID });
2f0790c4 63
bc1171c3 64With a has_many relationship called "books" on Author (see below for details),
65we can do this instead:
66
67 my $fredsbooks = $schema->resultset('Author')->find({ Name => 'Fred' })->books;
68
75d07914 69Each relationship sets up an accessor method on the
bc1171c3 70L<DBIx::Class::Manual::Glossary/"Row"> objects that represent the items
71of your table. From L<DBIx::Class::Manual::Glossary/"ResultSet"> objects,
75d07914 72the relationships can be searched using the "search_related" method.
bc1171c3 73In list context, each returns a list of Row objects for the related class,
74in scalar context, a new ResultSet representing the joined tables is
75returned. Thus, the calls can be chained to produce complex queries.
76Since the database is not actually queried until you attempt to retrieve
77the data for an actual item, no time is wasted producing them.
78
bc0c9800 79 my $cheapfredbooks = $schema->resultset('Author')->find({
80 Name => 'Fred',
81 })->books->search_related('prices', {
82 Price => { '<=' => '5.00' },
83 });
bc1171c3 84
85will produce a query something like:
86
75d07914 87 SELECT * FROM Author me
bc1171c3 88 LEFT JOIN Books books ON books.author = me.id
89 LEFT JOIN Prices prices ON prices.book = books.id
90 WHERE prices.Price <= 5.00
91
92all without needing multiple fetches.
34d52be2 93
bfab575a 94Only the helper methods for setting up standard relationship types
d2113a68 95are documented here. For the basic, lower-level methods, and a description
96of all the useful *_related methods that you get for free, see
bfab575a 97L<DBIx::Class::Relationship::Base>.
503536d5 98
34d52be2 99=head1 METHODS
100
bfab575a 101All helper methods take the following arguments:
503536d5 102
8091aa91 103 __PACKAGE__>$method_name('relname', 'Foreign::Class', $cond, $attrs);
bfab575a 104
105Both C<$cond> and C<$attrs> are optional. Pass C<undef> for C<$cond> if
106you want to use the default value for it, but still want to set C<$attrs>.
2535b501 107
9e64dfbf 108See L<DBIx::Class::Relationship::Base> for a list of valid attributes and valid
109relationship attributes.
503536d5 110
bfab575a 111=head2 belongs_to
503536d5 112
2f3105ce 113=over 4
114
9e64dfbf 115=item Arguments: $accessor_name, $related_class, $foreign_key_column|$cond?, $attr?
2f3105ce 116
117=back
118
7a2c1380 119Creates a relationship where the calling class stores the foreign class's
120primary key in one (or more) of its columns. This relationship defaults to
121using C<$accessor_name> as the foreign key in C<$related_class> to resolve the
122join, unless C<$foreign_key_column> specifies the foreign key column in
123C<$related_class> or C<$cond> specifies a reference to a join condition hash.
124
125=over
126
127=item accessor_name
128
129This argument is the name of the method you can call on a
130L<DBIx::Class::Row> object to retrieve the instance of the foreign
131class matching this relationship.
132
133Use this accessor_name (relation name) in L<DBIx::Class::ResultSet/join>
134or L<DBIx::Class::ResultSet/prefetch> to join to the foreign table
135indicated by this relationship.
136
137=item related_class
138
139This is the class name of the table referenced by the foreign key in
140this class.
141
142=item foreign_key_column
143
144The column name on this class that contains the foreign key.
145
146OR
147
148=item cond
149
150A hashref where the keys are C<foreign.$column_on_related_table> and
151the values are C<self.$foreign_key_column>. This is useful for
152relations that are across multiple columns.
153
154=back
155
156
c99393ff 157 # in a Book class (where Author has many Books)
9e64dfbf 158 My::DBIC::Schema::Book->belongs_to( author => 'My::DBIC::Schema::Author' );
2535b501 159
160 my $author_obj = $obj->author; # get author object
9e64dfbf 161 $obj->author( $new_author_obj ); # set author object
162
163The above belongs_to relationship could also have been specified as,
2535b501 164
9e64dfbf 165 My::DBIC::Schema::Book->belongs_to( author,
166 'My::DBIC::Schema::Author',
826daaae 167 { 'foreign.author' => 'self.author' } );
503536d5 168
2f3105ce 169If the relationship is optional -- i.e. the column containing the foreign key
170can be NULL -- then the belongs_to relationship does the right thing. Thus, in
171the example above C<$obj-E<gt>author> would return C<undef>. However in this
172case you would probably want to set the C<join_type> attribute so that a C<LEFT
173JOIN> is done, which makes complex resultsets involving C<join> or C<prefetch>
174operations work correctly. The modified declaration is shown below:
2c3ad870 175
b8810cc5 176 # in a Book class (where Author has_many Books)
2c3ad870 177 __PACKAGE__->belongs_to(author => 'My::DBIC::Schema::Author',
178 'author', {join_type => 'left'});
179
180
b8810cc5 181Cascading deletes are off by default on a C<belongs_to>
182relationship. To turn them on, pass C<< cascade_delete => 1 >>
183in the $attr hashref.
e8e9e5c7 184
8091aa91 185NOTE: If you are used to L<Class::DBI> relationships, this is the equivalent
186of C<has_a>.
503536d5 187
9e64dfbf 188See L<DBIx::Class::Relationship::Base> for documentation on relationship
189methods and valid relationship attributes.
2535b501 190
bfab575a 191=head2 has_many
503536d5 192
2f3105ce 193=over 4
194
2535b501 195=item Arguments: $accessor_name, $related_class, $foreign_key_column|$cond?, $attr?
2f3105ce 196
197=back
198
7a2c1380 199Creates a one-to-many relationship, where the corresponding elements of the
200foreign class store the calling class's primary key in one (or more) of its
201columns. This relationship defaults to using C<$accessor_name> as the foreign
202key in C<$related_class> to resolve the join, unless C<$foreign_key_column>
203specifies the foreign key column in C<$related_class> or C<$cond> specifies a
204reference to a join condition hash.
205
206=over
207
208=item accessor_name
209
210This argument is the name of the method you can call on a
211L<DBIx::Class::Row> object to retrieve a resultset of the related
212class restricted to the ones related to the row object. In list
213context it returns the row objects.
214
215Use this accessor_name (relation name) in L<DBIx::Class::ResultSet/join>
216or L<DBIx::Class::ResultSet/prefetch> to join to the foreign table
217indicated by this relationship.
218
219=item related_class
220
221This is the class name of the table which contains a foreign key
222column containing PK values of this class.
223
224=item foreign_key_column
225
226The column name on the related class that contains the foreign key.
227
228OR
229
230=item cond
231
232A hashref where the keys are C<foreign.$column_on_related_table> and
233the values are C<self.$foreign_key_column>. This is useful for
234relations that are across multiple columns.
235
236=back
237
b8810cc5 238 # in an Author class (where Author has_many Books)
d2113a68 239 My::DBIC::Schema::Author->has_many(books => 'My::DBIC::Schema::Book', 'author');
2535b501 240
c99393ff 241 my $booklist = $obj->books;
bc0c9800 242 my $booklist = $obj->books({
243 name => { LIKE => '%macaroni%' },
244 { prefetch => [qw/book/],
245 });
c99393ff 246 my @book_objs = $obj->books;
5b89a768 247 my $books_rs = $obj->books;
248 ( $books_rs ) = $obj->books_rs;
503536d5 249
c99393ff 250 $obj->add_to_books(\%col_data);
503536d5 251
2535b501 252The above C<has_many> relationship could also have been specified with an
253explicit join condition:
254
255 My::DBIC::Schema::Author->has_many( books => 'My::DBIC::Schema::Book', {
256 'foreign.author' => 'self.author',
257 });
258
60a8fb95 259Three methods are created when you create a has_many relationship. The first
2f3105ce 260method is the expected accessor method, C<$accessor_name()>. The second is
261almost exactly the same as the accessor method but "_rs" is added to the end of
262the method name. This method works just like the normal accessor, except that
263it returns a resultset no matter what, even in list context. The third method,
2535b501 264named C<< add_to_$relname >>, will also be added to your Row items; this
2f3105ce 265allows you to insert new related items, using the same mechanism as in
5b89a768 266L<DBIx::Class::Relationship::Base/"create_related">.
d2113a68 267
8091aa91 268If you delete an object in a class with a C<has_many> relationship, all
b8810cc5 269the related objects will be deleted as well. To turn this behaviour off,
270pass C<< cascade_delete => 0 >> in the C<$attr> hashref. However, any
271database-level cascade or restrict will take precedence over a
272DBIx-Class-based cascading delete.
503536d5 273
9e64dfbf 274See L<DBIx::Class::Relationship::Base> for documentation on relationship
275methods and valid relationship attributes.
2535b501 276
bfab575a 277=head2 might_have
503536d5 278
2f3105ce 279=over 4
280
9e64dfbf 281=item Arguments: $accessor_name, $related_class, $foreign_key_column|$cond?, $attr?
2f3105ce 282
283=back
284
7a2c1380 285Creates an optional one-to-one relationship with a class. This relationship
286defaults to using C<$accessor_name> as the foreign key in C<$related_class> to
287resolve the join, unless C<$foreign_key_column> specifies the foreign key
288column in C<$related_class> or C<$cond> specifies a reference to a join
289condition hash.
290
291=over
292
293=item accessor_name
294
295This argument is the name of the method you can call on a
296L<DBIx::Class::Row> object to retrieve the instance of the foreign
297class matching this relationship.
298
299Use this accessor_name (relation name) in L<DBIx::Class::ResultSet/join>
300or L<DBIx::Class::ResultSet/prefetch> to join to the foreign table
301indicated by this relationship.
302
303=item related_class
304
305This is the class name of the table which contains a foreign key
306column containing PK values of this class.
307
308=item foreign_key_column
309
310The column name on the related class that contains the foreign key.
311
312OR
313
314=item cond
315
316A hashref where the keys are C<foreign.$column_on_related_table> and
317the values are C<self.$foreign_key_column>. This is useful for
318relations that are across multiple columns.
319
320=back
321
9e64dfbf 322 My::DBIC::Schema::Author->might_have( pseudonym =>
323 'My::DBIC::Schema::Pseudonym' );
2f3105ce 324
880a1a0c 325 my $pname = $obj->pseudonym; # to get the Pseudonym object
8091aa91 326
9e64dfbf 327The above might_have relationship could have been specified as:
328
329 My::DBIC::Schema::Author->might_have( pseudonym =>
330 'My::DBIC::Schema::Pseudonym',
331 'author' );
332
333Or even:
334
335 My::DBIC::Schema::Author->might_have( pseudonym =>
336 'My::DBIC::Schema::Pseudonym',
337 { 'foreign.author' => 'self.author' } );
338
c99393ff 339If you update or delete an object in a class with a C<might_have>
b8810cc5 340relationship, the related object will be updated or deleted as well. To
341turn off this behavior, add C<< cascade_delete => 0 >> to the C<$attr>
342hashref. Any database-level update or delete constraints will override
343this behavior.
503536d5 344
9e64dfbf 345See L<DBIx::Class::Relationship::Base> for documentation on relationship
346methods and valid relationship attributes.
2f3105ce 347
bfab575a 348=head2 has_one
349
2f3105ce 350=over 4
351
352=item Arguments: $accessor_name, $related_class_name, $join_condition?, $attr?
353
354=back
355
d2113a68 356 My::DBIC::Schema::Book->has_one(isbn => 'My::DBIC::Schema::ISBN');
2f3105ce 357
358 my $isbn_obj = $obj->isbn; # to get the ISBN object
bfab575a 359
c99393ff 360Creates a one-to-one relationship with another class. This is just like
361C<might_have>, except the implication is that the other object is always
362present. The only difference between C<has_one> and C<might_have> is that
363C<has_one> uses an (ordinary) inner join, whereas C<might_have> uses a
364left join.
503536d5 365
2f3105ce 366The has_one relationship should be used when a row in the table has exactly one
367related row in another table. If the related row might not exist in the foreign
368table, use the L<DBIx::Class::Relationship/might_have> relationship.
369
370In the above example, each Book in the database is associated with exactly one
371ISBN object.
7411204b 372
9e64dfbf 373See L<DBIx::Class::Relationship::Base> for documentation on relationship
374methods and valid relationship attributes.
87c4e602 375
2535b501 376=head2 many_to_many
2f3105ce 377
378=over 4
379
2535b501 380=item Arguments: $accessor_name, $link_rel_name, $foreign_rel_name, $attr?
303cf522 381
2f3105ce 382=back
383
7a2c1380 384C<many_to_many> is not strictly a relationship in its own right. Instead, it is
385a bridge between two resultsets which provide the same kind of convenience
386accessors as true relationships provide. Although the accessor will return a
387resultset or collection of objects just like has_many does, you cannot call
388C<related_resultset> and similar methods which operate on true relationships.
389
390=over
391
392=item accessor_name
393
394This argument is the name of the method you can call on a
395L<DBIx::Class::Row> object to retrieve the rows matching this
396relationship.
397
398On a many_to_many, unlike other relationships, this cannot be used in
399L<DBIx::Class::ResultSet/search> to join tables. Use the relations
400bridged across instead.
401
402=item link_rel_name
403
404This is the accessor_name from the has_many relationship we are
405bridging from.
406
407=item foreign_rel_name
408
409This is the accessor_name of the belongs_to relationship in the link
410table that we are bridging across (which gives us the table we are
411bridging to).
412
413=back
414
2f3105ce 415To create a many_to_many relationship from Actor to Role:
416
75d07914 417 My::DBIC::Schema::Actor->has_many( actor_roles =>
d2113a68 418 'My::DBIC::Schema::ActorRoles',
419 'actor' );
75d07914 420 My::DBIC::Schema::ActorRoles->belongs_to( role =>
d2113a68 421 'My::DBIC::Schema::Role' );
75d07914 422 My::DBIC::Schema::ActorRoles->belongs_to( actor =>
d2113a68 423 'My::DBIC::Schema::Actor' );
424
425 My::DBIC::Schema::Actor->many_to_many( roles => 'actor_roles',
71d5ed18 426 'role' );
bc0c9800 427
2f3105ce 428And, for the reverse relationship, from Role to Actor:
429
430 My::DBIC::Schema::Role->has_many( actor_roles =>
431 'My::DBIC::Schema::ActorRoles',
432 'role' );
433
434 My::DBIC::Schema::Role->many_to_many( actors => 'actor_roles', 'actor' );
435
787d6a29 436To add a role for your actor, and fill in the year of the role in the
437actor_roles table:
438
439 $actor->add_to_roles($role, { year => 1995 });
440
2535b501 441In the above example, ActorRoles is the link table class, and Role is the
442foreign class. The C<$link_rel_name> parameter is the name of the accessor for
443the has_many relationship from this table to the link table, and the
444C<$foreign_rel_name> parameter is the accessor for the belongs_to relationship
445from the link table to the foreign table.
446
d2113a68 447To use many_to_many, existing relationships from the original table to the link
75d07914 448table, and from the link table to the end table must already exist, these
d2113a68 449relation names are then used in the many_to_many call.
7411204b 450
2535b501 451In the above example, the Actor class will have 3 many_to_many accessor methods
2f3105ce 452set: C<$roles>, C<$add_to_roles>, C<$set_roles>, and similarly named accessors
2535b501 453will be created for the Role class for the C<actors> many_to_many
454relationship.
455
9e64dfbf 456See L<DBIx::Class::Relationship::Base> for documentation on relationship
457methods and valid relationship attributes.
2f3105ce 458
34d52be2 459=cut
460
b8e1e21f 4611;
34d52be2 462
34d52be2 463=head1 AUTHORS
464
daec44b8 465Matt S. Trout <mst@shadowcatsystems.co.uk>
34d52be2 466
467=head1 LICENSE
468
469You may distribute this code under the same terms as Perl itself.
470
471=cut
472