created storage method to execute a coderef using master storage only, changed tnx_do...
[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
f4e92c39 274If you copy an object in a class with a C<has_many> relationship, all
275the related objects will be copied as well. To turn this behaviour off,
2fef093d 276pass C<< cascade_copy => 0 >> in the C<$attr> hashref. The behaviour
277defaults to C<< cascade_copy => 1 >>.
f4e92c39 278
9e64dfbf 279See L<DBIx::Class::Relationship::Base> for documentation on relationship
280methods and valid relationship attributes.
2535b501 281
bfab575a 282=head2 might_have
503536d5 283
2f3105ce 284=over 4
285
9e64dfbf 286=item Arguments: $accessor_name, $related_class, $foreign_key_column|$cond?, $attr?
2f3105ce 287
288=back
289
7a2c1380 290Creates an optional one-to-one relationship with a class. This relationship
291defaults to using C<$accessor_name> as the foreign key in C<$related_class> to
292resolve the join, unless C<$foreign_key_column> specifies the foreign key
293column in C<$related_class> or C<$cond> specifies a reference to a join
294condition hash.
295
296=over
297
298=item accessor_name
299
300This argument is the name of the method you can call on a
301L<DBIx::Class::Row> object to retrieve the instance of the foreign
302class matching this relationship.
303
304Use this accessor_name (relation name) in L<DBIx::Class::ResultSet/join>
305or L<DBIx::Class::ResultSet/prefetch> to join to the foreign table
306indicated by this relationship.
307
308=item related_class
309
310This is the class name of the table which contains a foreign key
311column containing PK values of this class.
312
313=item foreign_key_column
314
315The column name on the related class that contains the foreign key.
316
317OR
318
319=item cond
320
321A hashref where the keys are C<foreign.$column_on_related_table> and
322the values are C<self.$foreign_key_column>. This is useful for
323relations that are across multiple columns.
324
325=back
326
9e64dfbf 327 My::DBIC::Schema::Author->might_have( pseudonym =>
328 'My::DBIC::Schema::Pseudonym' );
2f3105ce 329
880a1a0c 330 my $pname = $obj->pseudonym; # to get the Pseudonym object
8091aa91 331
9e64dfbf 332The above might_have relationship could have been specified as:
333
334 My::DBIC::Schema::Author->might_have( pseudonym =>
335 'My::DBIC::Schema::Pseudonym',
336 'author' );
337
338Or even:
339
340 My::DBIC::Schema::Author->might_have( pseudonym =>
341 'My::DBIC::Schema::Pseudonym',
342 { 'foreign.author' => 'self.author' } );
343
c99393ff 344If you update or delete an object in a class with a C<might_have>
b8810cc5 345relationship, the related object will be updated or deleted as well. To
346turn off this behavior, add C<< cascade_delete => 0 >> to the C<$attr>
347hashref. Any database-level update or delete constraints will override
348this behavior.
503536d5 349
9e64dfbf 350See L<DBIx::Class::Relationship::Base> for documentation on relationship
351methods and valid relationship attributes.
2f3105ce 352
bfab575a 353=head2 has_one
354
2f3105ce 355=over 4
356
357=item Arguments: $accessor_name, $related_class_name, $join_condition?, $attr?
358
359=back
360
d2113a68 361 My::DBIC::Schema::Book->has_one(isbn => 'My::DBIC::Schema::ISBN');
2f3105ce 362
363 my $isbn_obj = $obj->isbn; # to get the ISBN object
bfab575a 364
c99393ff 365Creates a one-to-one relationship with another class. This is just like
366C<might_have>, except the implication is that the other object is always
367present. The only difference between C<has_one> and C<might_have> is that
368C<has_one> uses an (ordinary) inner join, whereas C<might_have> uses a
369left join.
503536d5 370
2f3105ce 371The has_one relationship should be used when a row in the table has exactly one
372related row in another table. If the related row might not exist in the foreign
373table, use the L<DBIx::Class::Relationship/might_have> relationship.
374
375In the above example, each Book in the database is associated with exactly one
376ISBN object.
7411204b 377
9e64dfbf 378See L<DBIx::Class::Relationship::Base> for documentation on relationship
379methods and valid relationship attributes.
87c4e602 380
2535b501 381=head2 many_to_many
2f3105ce 382
383=over 4
384
2535b501 385=item Arguments: $accessor_name, $link_rel_name, $foreign_rel_name, $attr?
303cf522 386
2f3105ce 387=back
388
7a2c1380 389C<many_to_many> is not strictly a relationship in its own right. Instead, it is
390a bridge between two resultsets which provide the same kind of convenience
391accessors as true relationships provide. Although the accessor will return a
392resultset or collection of objects just like has_many does, you cannot call
393C<related_resultset> and similar methods which operate on true relationships.
394
395=over
396
397=item accessor_name
398
399This argument is the name of the method you can call on a
400L<DBIx::Class::Row> object to retrieve the rows matching this
401relationship.
402
403On a many_to_many, unlike other relationships, this cannot be used in
404L<DBIx::Class::ResultSet/search> to join tables. Use the relations
405bridged across instead.
406
407=item link_rel_name
408
409This is the accessor_name from the has_many relationship we are
410bridging from.
411
412=item foreign_rel_name
413
414This is the accessor_name of the belongs_to relationship in the link
415table that we are bridging across (which gives us the table we are
416bridging to).
417
418=back
419
2f3105ce 420To create a many_to_many relationship from Actor to Role:
421
75d07914 422 My::DBIC::Schema::Actor->has_many( actor_roles =>
d2113a68 423 'My::DBIC::Schema::ActorRoles',
424 'actor' );
75d07914 425 My::DBIC::Schema::ActorRoles->belongs_to( role =>
d2113a68 426 'My::DBIC::Schema::Role' );
75d07914 427 My::DBIC::Schema::ActorRoles->belongs_to( actor =>
d2113a68 428 'My::DBIC::Schema::Actor' );
429
430 My::DBIC::Schema::Actor->many_to_many( roles => 'actor_roles',
71d5ed18 431 'role' );
bc0c9800 432
2f3105ce 433And, for the reverse relationship, from Role to Actor:
434
435 My::DBIC::Schema::Role->has_many( actor_roles =>
436 'My::DBIC::Schema::ActorRoles',
437 'role' );
438
439 My::DBIC::Schema::Role->many_to_many( actors => 'actor_roles', 'actor' );
440
787d6a29 441To add a role for your actor, and fill in the year of the role in the
442actor_roles table:
443
444 $actor->add_to_roles($role, { year => 1995 });
445
2535b501 446In the above example, ActorRoles is the link table class, and Role is the
447foreign class. The C<$link_rel_name> parameter is the name of the accessor for
448the has_many relationship from this table to the link table, and the
449C<$foreign_rel_name> parameter is the accessor for the belongs_to relationship
450from the link table to the foreign table.
451
d2113a68 452To use many_to_many, existing relationships from the original table to the link
75d07914 453table, and from the link table to the end table must already exist, these
d2113a68 454relation names are then used in the many_to_many call.
7411204b 455
2535b501 456In the above example, the Actor class will have 3 many_to_many accessor methods
2f3105ce 457set: C<$roles>, C<$add_to_roles>, C<$set_roles>, and similarly named accessors
2535b501 458will be created for the Role class for the C<actors> many_to_many
459relationship.
460
9e64dfbf 461See L<DBIx::Class::Relationship::Base> for documentation on relationship
462methods and valid relationship attributes.
2f3105ce 463
34d52be2 464=cut
465
b8e1e21f 4661;
34d52be2 467
34d52be2 468=head1 AUTHORS
469
daec44b8 470Matt S. Trout <mst@shadowcatsystems.co.uk>
34d52be2 471
472=head1 LICENSE
473
474You may distribute this code under the same terms as Perl itself.
475
476=cut
477