Annotate every indirect sugar-method
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship / Base.pm
CommitLineData
55e2d745 1package DBIx::Class::Relationship::Base;
2
3use strict;
4use warnings;
5
1edd1722 6use base qw/DBIx::Class/;
6298a324 7
8use Scalar::Util qw/weaken blessed/;
ed7ab0f4 9use Try::Tiny;
e5053694 10use DBIx::Class::_Util qw( UNRESOLVABLE_CONDITION fail_on_internal_call );
fd323bf1 11use namespace::clean;
55e2d745 12
75d07914 13=head1 NAME
55e2d745 14
8918977e 15DBIx::Class::Relationship::Base - Inter-table relationships
55e2d745 16
17=head1 SYNOPSIS
18
6c4f4d69 19 __PACKAGE__->add_relationship(
20 spiders => 'My::DB::Result::Creatures',
21 sub {
22 my $args = shift;
23 return {
24 "$args->{foreign_alias}.id" => { -ident => "$args->{self_alias}.id" },
25 "$args->{foreign_alias}.type" => 'arachnid'
26 };
27 },
28 );
13523f29 29
55e2d745 30=head1 DESCRIPTION
31
30236e47 32This class provides methods to describe the relationships between the
33tables in your database model. These are the "bare bones" relationships
75d07914 34methods, for predefined ones, look in L<DBIx::Class::Relationship>.
55e2d745 35
36=head1 METHODS
37
8091aa91 38=head2 add_relationship
503536d5 39
27f01d1f 40=over 4
41
a5f5e470 42=item Arguments: $rel_name, $foreign_class, $condition, $attrs
27f01d1f 43
44=back
30236e47 45
a5f5e470 46 __PACKAGE__->add_relationship('rel_name',
6c4f4d69 47 'Foreign::Class',
13523f29 48 $condition, $attrs);
49
50Create a custom relationship between one result source and another
51source, indicated by its class name.
503536d5 52
406734bb 53=head3 condition
54
6c4f4d69 55The condition argument describes the C<ON> clause of the C<JOIN>
56expression used to connect the two sources when creating SQL queries.
30236e47 57
5d2588cc 58=head4 Simple equality
59
60To create simple equality joins, supply a hashref containing the remote
61table column name as the key(s) prefixed by C<'foreign.'>, and the
62corresponding local table column name as the value(s) prefixed by C<'self.'>.
63Both C<foreign> and C<self> are pseudo aliases and must be entered
64literally. They will be replaced with the actual correct table alias
65when the SQL is produced.
66
67For example given:
503536d5 68
6c4f4d69 69 My::Schema::Author->has_many(
70 books => 'My::Schema::Book',
71 { 'foreign.author_id' => 'self.id' }
72 );
503536d5 73
6c4f4d69 74A query like:
75
76 $author_rs->search_related('books')->next
503536d5 77
6c4f4d69 78will result in the following C<JOIN> clause:
79
80 ... FROM author me LEFT JOIN book books ON books.author_id = me.id ...
503536d5 81
13523f29 82This describes a relationship between the C<Author> table and the
83C<Book> table where the C<Book> table has a column C<author_id>
84containing the ID value of the C<Author>.
85
13523f29 86Similarly:
5271499d 87
6c4f4d69 88 My::Schema::Book->has_many(
89 editions => 'My::Schema::Edition',
90 {
91 'foreign.publisher_id' => 'self.publisher_id',
92 'foreign.type_id' => 'self.type_id',
93 }
94 );
95
96 ...
97
98 $book_rs->search_related('editions')->next
5271499d 99
13523f29 100will result in the C<JOIN> clause:
5271499d 101
6c4f4d69 102 ... FROM book me
103 LEFT JOIN edition editions ON
104 editions.publisher_id = me.publisher_id
105 AND editions.type_id = me.type_id ...
5271499d 106
13523f29 107This describes the relationship from C<Book> to C<Edition>, where the
108C<Edition> table refers to a publisher and a type (e.g. "paperback"):
109
5d2588cc 110=head4 Multiple groups of simple equality conditions
111
13523f29 112As is the default in L<SQL::Abstract>, the key-value pairs will be
5d2588cc 113C<AND>ed in the resulting C<JOIN> clause. An C<OR> can be achieved with
114an arrayref. For example a condition like:
13523f29 115
6c4f4d69 116 My::Schema::Item->has_many(
117 related_item_links => My::Schema::Item::Links,
118 [
119 { 'foreign.left_itemid' => 'self.id' },
120 { 'foreign.right_itemid' => 'self.id' },
121 ],
122 );
13523f29 123
6c4f4d69 124will translate to the following C<JOIN> clause:
13523f29 125
6c4f4d69 126 ... FROM item me JOIN item_relations related_item_links ON
127 related_item_links.left_itemid = me.id
128 OR related_item_links.right_itemid = me.id ...
13523f29 129
6c4f4d69 130This describes the relationship from C<Item> to C<Item::Links>, where
131C<Item::Links> is a many-to-many linking table, linking items back to
132themselves in a peer fashion (without a "parent-child" designation)
13523f29 133
84d8c2ad 134=head4 Custom join conditions
135
5d2588cc 136 NOTE: The custom join condition specification mechanism is capable of
137 generating JOIN clauses of virtually unlimited complexity. This may limit
138 your ability to traverse some of the more involved relationship chains the
139 way you expect, *and* may bring your RDBMS to its knees. Exercise care
140 when declaring relationships as described here.
141
6c4f4d69 142To specify joins which describe more than a simple equality of column
143values, the custom join condition coderef syntax can be used. For
144example:
13523f29 145
6c4f4d69 146 My::Schema::Artist->has_many(
147 cds_80s => 'My::Schema::CD',
13523f29 148 sub {
6c4f4d69 149 my $args = shift;
13523f29 150
6c4f4d69 151 return {
152 "$args->{foreign_alias}.artist" => { -ident => "$args->{self_alias}.artistid" },
153 "$args->{foreign_alias}.year" => { '>', "1979", '<', "1990" },
154 };
155 }
156 );
13523f29 157
6c4f4d69 158 ...
13523f29 159
6c4f4d69 160 $artist_rs->search_related('cds_80s')->next;
13523f29 161
6c4f4d69 162will result in the C<JOIN> clause:
13523f29 163
6c4f4d69 164 ... FROM artist me LEFT JOIN cd cds_80s ON
165 cds_80s.artist = me.artistid
166 AND cds_80s.year < ?
167 AND cds_80s.year > ?
13523f29 168
6c4f4d69 169with the bind values:
13523f29 170
6c4f4d69 171 '1990', '1979'
13523f29 172
6c4f4d69 173C<< $args->{foreign_alias} >> and C<< $args->{self_alias} >> are supplied the
174same values that would be otherwise substituted for C<foreign> and C<self>
175in the simple hashref syntax case.
176
177The coderef is expected to return a valid L<SQL::Abstract> query-structure, just
178like what one would supply as the first argument to
179L<DBIx::Class::ResultSet/search>. The return value will be passed directly to
180L<SQL::Abstract> and the resulting SQL will be used verbatim as the C<ON>
181clause of the C<JOIN> statement associated with this relationship.
182
183While every coderef-based condition must return a valid C<ON> clause, it may
ef0845ba 184elect to additionally return a simplified B<optional> join-free condition
e884e5d9 185consisting of a hashref with B<all keys being fully qualified names of columns
186declared on the corresponding result source>. This boils down to two scenarios:
187
188=over
189
190=item *
191
192When relationship resolution is invoked after C<< $result->$rel_name >>, as
193opposed to C<< $rs->related_resultset($rel_name) >>, the C<$result> object
194is passed to the coderef as C<< $args->{self_result_object} >>.
195
196=item *
197
198Alternatively when the user-space invokes resolution via
199C<< $result->set_from_related( $rel_name => $foreign_values_or_object ) >>, the
200corresponding data is passed to the coderef as C<< $args->{foreign_values} >>,
201B<always> in the form of a hashref. If a foreign result object is supplied
202(which is valid usage of L</set_from_related>), its values will be extracted
203into hashref form by calling L<get_columns|DBIx::Class::Row/get_columns>.
204
205=back
206
207Note that the above scenarios are mutually exclusive, that is you will be supplied
208none or only one of C<self_result_object> and C<foreign_values>. In other words if
209you define your condition coderef as:
6c4f4d69 210
211 sub {
212 my $args = shift;
213
214 return (
215 {
216 "$args->{foreign_alias}.artist" => { -ident => "$args->{self_alias}.artistid" },
217 "$args->{foreign_alias}.year" => { '>', "1979", '<', "1990" },
218 },
ef0845ba 219 ! $args->{self_result_object} ? () : {
98def3ef 220 "$args->{foreign_alias}.artist" => $args->{self_result_object}->artistid,
6c4f4d69 221 "$args->{foreign_alias}.year" => { '>', "1979", '<', "1990" },
222 },
e884e5d9 223 ! $args->{foreign_values} ? () : {
224 "$args->{self_alias}.artistid" => $args->{foreign_values}{artist},
ef0845ba 225 }
6c4f4d69 226 );
13523f29 227 }
228
ef0845ba 229Then this code:
13523f29 230
231 my $artist = $schema->resultset("Artist")->find({ id => 4 });
232 $artist->cds_80s->all;
233
6c4f4d69 234Can skip a C<JOIN> altogether and instead produce:
13523f29 235
6c4f4d69 236 SELECT cds_80s.cdid, cds_80s.artist, cds_80s.title, cds_80s.year, cds_80s.genreid, cds_80s.single_track
237 FROM cd cds_80s
238 WHERE cds_80s.artist = ?
239 AND cds_80s.year < ?
240 AND cds_80s.year > ?
13523f29 241
242With the bind values:
243
244 '4', '1990', '1979'
245
ef0845ba 246While this code:
247
248 my $cd = $schema->resultset("CD")->search({ artist => 1 }, { rows => 1 })->single;
249 my $artist = $schema->resultset("Artist")->new({});
250 $artist->set_from_related('cds_80s');
251
252Will properly set the C<< $artist->artistid >> field of this new object to C<1>
253
e884e5d9 254Note that in order to be able to use L</set_from_related> (and by extension
255L<< $result->create_related|DBIx::Class::Relationship::Base/create_related >>),
256the returned join free condition B<must> contain only plain values/deflatable
257objects. For instance the C<year> constraint in the above example prevents
258the relationship from being used to create related objects using
259C<< $artst->create_related( cds_80s => { title => 'blah' } ) >> (an
260exception will be thrown).
6c4f4d69 261
262In order to allow the user to go truly crazy when generating a custom C<ON>
263clause, the C<$args> hashref passed to the subroutine contains some extra
264metadata. Currently the supplied coderef is executed as:
265
266 $relationship_info->{cond}->({
e884e5d9 267 self_resultsource => The resultsource instance on which rel_name is registered
268 rel_name => The relationship name (does *NOT* always match foreign_alias)
a446d7f8 269
e884e5d9 270 self_alias => The alias of the invoking resultset
271 foreign_alias => The alias of the to-be-joined resultset (does *NOT* always match rel_name)
a446d7f8 272
1adbd3fc 273 # only one of these (or none at all) will ever be supplied to aid in the
274 # construction of a join-free condition
e884e5d9 275
276 self_result_object => The invocant *object* itself in case of a call like
277 $result_object->$rel_name( ... )
278
279 foreign_values => A *hashref* of related data: may be passed in directly or
280 derived via ->get_columns() from a related object in case of
281 $result_object->set_from_related( $rel_name, $foreign_result_object )
a446d7f8 282
283 # deprecated inconsistent names, will be forever available for legacy code
e884e5d9 284 self_rowobj => Old deprecated slot for self_result_object
285 foreign_relname => Old deprecated slot for rel_name
6c4f4d69 286 });
8091aa91 287
406734bb 288=head3 attributes
289
290The L<standard ResultSet attributes|DBIx::Class::ResultSet/ATTRIBUTES> may
291be used as relationship attributes. In particular, the 'where' attribute is
292useful for filtering relationships:
293
294 __PACKAGE__->has_many( 'valid_users', 'MyApp::Schema::User',
295 { 'foreign.user_id' => 'self.user_id' },
296 { where => { valid => 1 } }
297 );
298
299The following attributes are also valid:
8091aa91 300
301=over 4
302
303=item join_type
304
305Explicitly specifies the type of join to use in the relationship. Any SQL
306join type is valid, e.g. C<LEFT> or C<RIGHT>. It will be placed in the SQL
307command immediately before C<JOIN>.
308
97c96475 309=item proxy =E<gt> $column | \@columns | \%column
310
9ab122aa 311The 'proxy' attribute can be used to retrieve values, and to perform
312updates if the relationship has 'cascade_update' set. The 'might_have'
313and 'has_one' relationships have this set by default; if you want a proxy
314to update across a 'belongs_to' relationship, you must set the attribute
315yourself.
316
97c96475 317=over 4
318
319=item \@columns
8091aa91 320
30236e47 321An arrayref containing a list of accessors in the foreign class to create in
8091aa91 322the main class. If, for example, you do the following:
d4daee7b 323
03460bef 324 MyApp::Schema::CD->might_have(liner_notes => 'MyApp::Schema::LinerNotes',
27f01d1f 325 undef, {
326 proxy => [ qw/notes/ ],
327 });
d4daee7b 328
03460bef 329Then, assuming MyApp::Schema::LinerNotes has an accessor named notes, you can do:
8091aa91 330
03460bef 331 my $cd = MyApp::Schema::CD->find(1);
30236e47 332 $cd->notes('Notes go here'); # set notes -- LinerNotes object is
333 # created if it doesn't exist
d4daee7b 334
9ab122aa 335For a 'belongs_to relationship, note the 'cascade_update':
336
a5fc4975 337 MyApp::Schema::Track->belongs_to( cd => 'MyApp::Schema::CD', 'cd,
9ab122aa 338 { proxy => ['title'], cascade_update => 1 }
339 );
340 $track->title('New Title');
341 $track->update; # updates title in CD
342
97c96475 343=item \%column
344
345A hashref where each key is the accessor you want installed in the main class,
4a0eed52 346and its value is the name of the original in the foreign class.
97c96475 347
a5fc4975 348 MyApp::Schema::Track->belongs_to( cd => 'MyApp::Schema::CD', 'cd', {
97c96475 349 proxy => { cd_title => 'title' },
350 });
351
dad42de6 352This will create an accessor named C<cd_title> on the C<$track> result object.
97c96475 353
354=back
355
356NOTE: you can pass a nested struct too, for example:
357
a5fc4975 358 MyApp::Schema::Track->belongs_to( cd => 'MyApp::Schema::CD', 'cd', {
97c96475 359 proxy => [ 'year', { cd_title => 'title' } ],
360 });
361
8091aa91 362=item accessor
363
364Specifies the type of accessor that should be created for the relationship.
365Valid values are C<single> (for when there is only a single related object),
366C<multi> (when there can be many), and C<filter> (for when there is a single
367related object, but you also want the relationship accessor to double as
368a column accessor). For C<multi> accessors, an add_to_* method is also
369created, which calls C<create_related> for the relationship.
370
3d618782 371=item is_foreign_key_constraint
372
373If you are using L<SQL::Translator> to create SQL for you and you find that it
fd323bf1 374is creating constraints where it shouldn't, or not creating them where it
3d618782 375should, set this attribute to a true or false value to override the detection
376of when to create constraints.
377
5f7ac523 378=item cascade_copy
379
380If C<cascade_copy> is true on a C<has_many> relationship for an
381object, then when you copy the object all the related objects will
fd323bf1 382be copied too. To turn this behaviour off, pass C<< cascade_copy => 0 >>
383in the C<$attr> hashref.
b7bbc39f 384
385The behaviour defaults to C<< cascade_copy => 1 >> for C<has_many>
386relationships.
5f7ac523 387
388=item cascade_delete
389
b7bbc39f 390By default, DBIx::Class cascades deletes across C<has_many>,
391C<has_one> and C<might_have> relationships. You can disable this
fd323bf1 392behaviour on a per-relationship basis by supplying
b7bbc39f 393C<< cascade_delete => 0 >> in the relationship attributes.
5f7ac523 394
395The cascaded operations are performed after the requested delete,
396so if your database has a constraint on the relationship, it will
397have deleted/updated the related records or raised an exception
398before DBIx::Class gets to perform the cascaded operation.
399
400=item cascade_update
401
b7bbc39f 402By default, DBIx::Class cascades updates across C<has_one> and
5f7ac523 403C<might_have> relationships. You can disable this behaviour on a
b7bbc39f 404per-relationship basis by supplying C<< cascade_update => 0 >> in
405the relationship attributes.
5f7ac523 406
9ab122aa 407The C<belongs_to> relationship does not update across relationships
408by default, so if you have a 'proxy' attribute on a belongs_to and want to
8848b5bd 409use 'update' on it, you must set C<< cascade_update => 1 >>.
9ab122aa 410
cee0c9b1 411This is not a RDMS style cascade update - it purely means that when
412an object has update called on it, all the related objects also
413have update called. It will not change foreign keys automatically -
414you must arrange to do this yourself.
5f7ac523 415
e377d723 416=item on_delete / on_update
417
418If you are using L<SQL::Translator> to create SQL for you, you can use these
fd323bf1 419attributes to explicitly set the desired C<ON DELETE> or C<ON UPDATE> constraint
420type. If not supplied the SQLT parser will attempt to infer the constraint type by
e377d723 421interrogating the attributes of the B<opposite> relationship. For any 'multi'
fd323bf1 422relationship with C<< cascade_delete => 1 >>, the corresponding belongs_to
423relationship will be created with an C<ON DELETE CASCADE> constraint. For any
e377d723 424relationship bearing C<< cascade_copy => 1 >> the resulting belongs_to constraint
425will be C<ON UPDATE CASCADE>. If you wish to disable this autodetection, and just
fd323bf1 426use the RDBMS' default constraint type, pass C<< on_delete => undef >> or
e377d723 427C<< on_delete => '' >>, and the same for C<on_update> respectively.
428
13de943d 429=item is_deferrable
430
431Tells L<SQL::Translator> that the foreign key constraint it creates should be
432deferrable. In other words, the user may request that the constraint be ignored
433until the end of the transaction. Currently, only the PostgreSQL producer
434actually supports this.
435
2581038c 436=item add_fk_index
437
438Tells L<SQL::Translator> to add an index for this constraint. Can also be
439specified globally in the args to L<DBIx::Class::Schema/deploy> or
440L<DBIx::Class::Schema/create_ddl_dir>. Default is on, set to 0 to disable.
441
8091aa91 442=back
443
87c4e602 444=head2 register_relationship
445
27f01d1f 446=over 4
447
dad42de6 448=item Arguments: $rel_name, $rel_info
27f01d1f 449
450=back
71e65b39 451
30236e47 452Registers a relationship on the class. This is called internally by
71f9df37 453DBIx::Class::ResultSourceProxy to set up Accessors and Proxies.
71e65b39 454
55e2d745 455=cut
456
71e65b39 457sub register_relationship { }
458
27f01d1f 459=head2 related_resultset
460
461=over 4
462
dad42de6 463=item Arguments: $rel_name
27f01d1f 464
dad42de6 465=item Return Value: L<$related_resultset|DBIx::Class::ResultSet>
27f01d1f 466
467=back
30236e47 468
27f01d1f 469 $rs = $cd->related_resultset('artist');
30236e47 470
27f01d1f 471Returns a L<DBIx::Class::ResultSet> for the relationship named
dad42de6 472$rel_name.
30236e47 473
93711422 474=head2 $relationship_accessor
475
476=over 4
477
dad42de6 478=item Arguments: none
93711422 479
dad42de6 480=item Return Value: L<$result|DBIx::Class::Manual::ResultClass> | L<$related_resultset|DBIx::Class::ResultSet> | undef
93711422 481
482=back
483
484 # These pairs do the same thing
47d7b769 485 $result = $cd->related_resultset('artist')->single; # has_one relationship
486 $result = $cd->artist;
93711422 487 $rs = $cd->related_resultset('tracks'); # has_many relationship
488 $rs = $cd->tracks;
489
8ed69929 490This is the recommended way to traverse through relationships, based
93711422 491on the L</accessor> name given in the relationship definition.
492
dad42de6 493This will return either a L<Result|DBIx::Class::Manual::ResultClass> or a
93711422 494L<ResultSet|DBIx::Class::ResultSet>, depending on if the relationship is
495C<single> (returns only one row) or C<multi> (returns many rows). The
496method may also return C<undef> if the relationship doesn't exist for
497this instance (like in the case of C<might_have> relationships).
498
30236e47 499=cut
500
501sub related_resultset {
8bb3f339 502 $_[0]->throw_exception(
503 '$result->related_resultset() no longer accepts extra search arguments, '
504 . 'you need to switch to ...->related_resultset($relname)->search_rs(...) '
505 . 'instead (it was never documented and more importantly could never work '
506 . 'reliably due to the heavy caching involved)'
507 ) if @_ > 2;
72c2540d 508
8bb3f339 509 $_[0]->throw_exception("Can't call *_related as class methods")
510 unless ref $_[0];
72c2540d 511
8bb3f339 512 return $_[0]->{related_resultsets}{$_[1]}
513 if defined $_[0]->{related_resultsets}{$_[1]};
d4daee7b 514
8bb3f339 515 my ($self, $rel) = @_;
3d0733aa 516
517 return $self->{related_resultsets}{$rel} = do {
3b4c4d72 518
4006691d 519 my $rsrc = $self->result_source;
520
521 my $rel_info = $rsrc->relationship_info($rel)
3b4c4d72 522 or $self->throw_exception( "No such relationship '$rel'" );
523
a4e58b18 524 my $cond_res = $rsrc->_resolve_relationship_condition(
525 rel_name => $rel,
526 self_result_object => $self,
527
528 # this may look weird, but remember that we are making a resultset
529 # out of an existing object, with the new source being at the head
530 # of the FROM chain. Having a 'me' alias is nothing but expected there
531 foreign_alias => 'me',
532
533 self_alias => "!!!\xFF()!!!_SHOULD_NEVER_BE_SEEN_IN_USE_!!!()\xFF!!!",
534
535 # not strictly necessary, but shouldn't hurt either
536 require_join_free_condition => !!(ref $rel_info->{cond} ne 'CODE'),
537 );
d419ded6 538
aa56106b 539 # keep in mind that the following if() block is part of a do{} - no return()s!!!
a4e58b18 540 if (
541 ! $cond_res->{join_free_condition}
542 and
543 ref $rel_info->{cond} eq 'CODE'
544 ) {
aa56106b 545
546 # A WHOREIFFIC hack to reinvoke the entire condition resolution
547 # with the correct alias. Another way of doing this involves a
548 # lot of state passing around, and the @_ positions are already
549 # mapped out, making this crap a less icky option.
550 #
551 # The point of this exercise is to retain the spirit of the original
552 # $obj->search_related($rel) where the resulting rset will have the
553 # root alias as 'me', instead of $rel (as opposed to invoking
554 # $rs->search_related)
555
777738d0 556 # make the fake 'me' rel
557 local $rsrc->{_relationships}{me} = {
558 %{ $rsrc->{_relationships}{$rel} },
559 _original_name => $rel,
560 };
561
72c2540d 562 my $obj_table_alias = lc($rsrc->source_name) . '__row';
93508f48 563 $obj_table_alias =~ s/\W+/_/g;
aa56106b 564
72c2540d 565 $rsrc->resultset->search(
aa56106b 566 $self->ident_condition($obj_table_alias),
567 { alias => $obj_table_alias },
e5053694 568 )->related_resultset('me')->search(undef, $rel_info->{attrs})
68f3b0dd 569 }
aa56106b 570 else {
8bb3f339 571
aa56106b 572 # FIXME - this conditional doesn't seem correct - got to figure out
573 # at some point what it does. Also the entire UNRESOLVABLE_CONDITION
574 # business seems shady - we could simply not query *at all*
a4e58b18 575 my $attrs;
576 if ( $cond_res->{join_free_condition} eq UNRESOLVABLE_CONDITION ) {
577 $attrs = { %{$rel_info->{attrs}} };
72c2540d 578 my $reverse = $rsrc->reverse_relationship_info($rel);
aa56106b 579 foreach my $rev_rel (keys %$reverse) {
580 if ($reverse->{$rev_rel}{attrs}{accessor} && $reverse->{$rev_rel}{attrs}{accessor} eq 'multi') {
0a03206a 581 weaken($attrs->{related_objects}{$rev_rel}[0] = $self);
aa56106b 582 } else {
0a03206a 583 weaken($attrs->{related_objects}{$rev_rel} = $self);
aa56106b 584 }
585 }
9aae3566 586 }
a126983e 587
a4e58b18 588 $rsrc->related_source($rel)->resultset->search(
589 $cond_res->{join_free_condition},
590 $attrs || $rel_info->{attrs},
591 );
7689b9e5 592 }
30236e47 593 };
594}
595
8091aa91 596=head2 search_related
503536d5 597
dad42de6 598=over 4
599
600=item Arguments: $rel_name, $cond?, L<\%attrs?|DBIx::Class::ResultSet/ATTRIBUTES>
601
602=item Return Value: L<$resultset|DBIx::Class::ResultSet> (scalar context) | L<@result_objs|DBIx::Class::Manual::ResultClass> (list context)
603
604=back
30236e47 605
606Run a search on a related resultset. The search will be restricted to the
dad42de6 607results represented by the L<DBIx::Class::ResultSet> it was called
608upon.
609
610See L<DBIx::Class::ResultSet/search_related> for more information.
503536d5 611
612=cut
613
1b822bd3 614sub search_related :DBIC_method_is_indirect_sugar {
e5053694 615 DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
616 shift->related_resultset(shift)->search(@_);
b52e9bf8 617}
618
5b89a768 619=head2 search_related_rs
620
fd323bf1 621This method works exactly the same as search_related, except that
48580715 622it guarantees a resultset, even in list context.
5b89a768 623
624=cut
625
1b822bd3 626sub search_related_rs :DBIC_method_is_indirect_sugar {
e5053694 627 DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
628 shift->related_resultset(shift)->search_rs(@_)
5b89a768 629}
630
b52e9bf8 631=head2 count_related
632
dad42de6 633=over 4
634
635=item Arguments: $rel_name, $cond?, L<\%attrs?|DBIx::Class::ResultSet/ATTRIBUTES>
636
637=item Return Value: $count
b52e9bf8 638
dad42de6 639=back
640
641Returns the count of all the rows in the related resultset, restricted by the
642current result or where conditions.
30236e47 643
b52e9bf8 644=cut
645
1b822bd3 646sub count_related :DBIC_method_is_indirect_sugar {
e5053694 647 DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
648 shift->related_resultset(shift)->search_rs(@_)->count;
55e2d745 649}
650
30236e47 651=head2 new_related
652
dad42de6 653=over 4
654
655=item Arguments: $rel_name, \%col_data
656
657=item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
30236e47 658
dad42de6 659=back
660
661Create a new result object of the related foreign class. It will magically set
662any foreign key columns of the new object to the related primary key columns
663of the source object for you. The newly created result will not be saved into
664your storage until you call L<DBIx::Class::Row/insert> on it.
30236e47 665
666=cut
667
668sub new_related {
83a6b244 669 my ($self, $rel, $data) = @_;
670
e5053694 671 $self->related_resultset($rel)->new_result( $self->result_source->_resolve_relationship_condition (
83a6b244 672 infer_values_based_on => $data,
673 rel_name => $rel,
98def3ef 674 self_result_object => $self,
83a6b244 675 foreign_alias => $rel,
676 self_alias => 'me',
677 )->{inferred_values} );
30236e47 678}
679
8091aa91 680=head2 create_related
503536d5 681
dad42de6 682=over 4
30236e47 683
dad42de6 684=item Arguments: $rel_name, \%col_data
685
686=item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
687
688=back
689
690 my $result = $obj->create_related($rel_name, \%col_data);
691
692Creates a new result object, similarly to new_related, and also inserts the
693result's data into your storage medium. See the distinction between C<create>
694and C<new> in L<DBIx::Class::ResultSet> for details.
503536d5 695
696=cut
697
55e2d745 698sub create_related {
3842b955 699 my $self = shift;
fea3d045 700 my $rel = shift;
78b948c3 701 my $obj = $self->new_related($rel, @_)->insert;
64acc2bc 702 delete $self->{related_resultsets}->{$rel};
703 return $obj;
55e2d745 704}
705
8091aa91 706=head2 find_related
503536d5 707
dad42de6 708=over 4
709
710=item Arguments: $rel_name, \%col_data | @pk_values, { key => $unique_constraint, L<%attrs|DBIx::Class::ResultSet/ATTRIBUTES> }?
711
712=item Return Value: L<$result|DBIx::Class::Manual::ResultClass> | undef
713
714=back
715
716 my $result = $obj->find_related($rel_name, \%col_data);
30236e47 717
718Attempt to find a related object using its primary key or unique constraints.
27f01d1f 719See L<DBIx::Class::ResultSet/find> for details.
503536d5 720
721=cut
722
1b822bd3 723sub find_related :DBIC_method_is_indirect_sugar {
4b8a53ea 724 #my ($self, $rel, @args) = @_;
e5053694 725 DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
726 return shift->related_resultset(shift)->find(@_);
1a14aa3f 727}
728
b3e1f1f5 729=head2 find_or_new_related
730
dad42de6 731=over 4
b3e1f1f5 732
dad42de6 733=item Arguments: $rel_name, \%col_data, { key => $unique_constraint, L<%attrs|DBIx::Class::ResultSet/ATTRIBUTES> }?
734
735=item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
736
737=back
738
739Find a result object of a related class. See L<DBIx::Class::ResultSet/find_or_new>
740for details.
b3e1f1f5 741
742=cut
743
744sub find_or_new_related {
745 my $self = shift;
e5053694 746 my $rel = shift;
747 my $obj = $self->related_resultset($rel)->find(@_);
748 return defined $obj ? $obj : $self->related_resultset($rel)->new_result(@_);
b3e1f1f5 749}
750
8091aa91 751=head2 find_or_create_related
503536d5 752
dad42de6 753=over 4
754
755=item Arguments: $rel_name, \%col_data, { key => $unique_constraint, L<%attrs|DBIx::Class::ResultSet/ATTRIBUTES> }?
756
757=item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
758
759=back
30236e47 760
dad42de6 761Find or create a result object of a related class. See
b3e1f1f5 762L<DBIx::Class::ResultSet/find_or_create> for details.
503536d5 763
764=cut
765
55e2d745 766sub find_or_create_related {
767 my $self = shift;
e5053694 768 my $rel = shift;
769 my $obj = $self->related_resultset($rel)->find(@_);
ab1043a6 770 return (defined($obj) ? $obj : $self->create_related( $rel => @_ ));
55e2d745 771}
772
045120e6 773=head2 update_or_create_related
774
dad42de6 775=over 4
776
777=item Arguments: $rel_name, \%col_data, { key => $unique_constraint, L<%attrs|DBIx::Class::ResultSet/ATTRIBUTES> }?
778
779=item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
780
781=back
045120e6 782
dad42de6 783Update or create a result object of a related class. See
f7e1846f 784L<DBIx::Class::ResultSet/update_or_create> for details.
045120e6 785
786=cut
787
1b822bd3 788sub update_or_create_related :DBIC_method_is_indirect_sugar {
4b8a53ea 789 #my ($self, $rel, @args) = @_;
e5053694 790 DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
4b8a53ea 791 shift->related_resultset(shift)->update_or_create(@_);
045120e6 792}
793
8091aa91 794=head2 set_from_related
503536d5 795
dad42de6 796=over 4
797
798=item Arguments: $rel_name, L<$result|DBIx::Class::Manual::ResultClass>
799
800=item Return Value: not defined
801
802=back
803
30236e47 804 $book->set_from_related('author', $author_obj);
ac8e89d7 805 $book->author($author_obj); ## same thing
30236e47 806
807Set column values on the current object, using related values from the given
808related object. This is used to associate previously separate objects, for
809example, to set the correct author for a book, find the Author object, then
810call set_from_related on the book.
811
ac8e89d7 812This is called internally when you pass existing objects as values to
48580715 813L<DBIx::Class::ResultSet/create>, or pass an object to a belongs_to accessor.
ac8e89d7 814
5529838f 815The columns are only set in the local copy of the object, call
816L<update|DBIx::Class::Row/update> to update them in the storage.
503536d5 817
818=cut
819
55e2d745 820sub set_from_related {
821 my ($self, $rel, $f_obj) = @_;
aa56106b 822
83a6b244 823 $self->set_columns( $self->result_source->_resolve_relationship_condition (
824 infer_values_based_on => {},
825 rel_name => $rel,
e884e5d9 826 foreign_values => $f_obj,
83a6b244 827 foreign_alias => $rel,
828 self_alias => 'me',
829 )->{inferred_values} );
a126983e 830
55e2d745 831 return 1;
832}
833
8091aa91 834=head2 update_from_related
503536d5 835
dad42de6 836=over 4
837
838=item Arguments: $rel_name, L<$result|DBIx::Class::Manual::ResultClass>
839
840=item Return Value: not defined
841
842=back
843
30236e47 844 $book->update_from_related('author', $author_obj);
845
27f01d1f 846The same as L</"set_from_related">, but the changes are immediately updated
847in storage.
503536d5 848
849=cut
850
55e2d745 851sub update_from_related {
852 my $self = shift;
853 $self->set_from_related(@_);
854 $self->update;
855}
856
8091aa91 857=head2 delete_related
503536d5 858
dad42de6 859=over 4
30236e47 860
dad42de6 861=item Arguments: $rel_name, $cond?, L<\%attrs?|DBIx::Class::ResultSet/ATTRIBUTES>
862
69bc5f2b 863=item Return Value: $underlying_storage_rv
dad42de6 864
865=back
866
867Delete any related row, subject to the given conditions. Internally, this
868calls:
869
870 $self->search_related(@_)->delete
871
872And returns the result of that.
503536d5 873
874=cut
875
55e2d745 876sub delete_related {
877 my $self = shift;
e5053694 878 my $rel = shift;
879 my $obj = $self->related_resultset($rel)->search_rs(@_)->delete;
880 delete $self->{related_resultsets}->{$rel};
64acc2bc 881 return $obj;
55e2d745 882}
883
ec353f53 884=head2 add_to_$rel
885
dad42de6 886B<Currently only available for C<has_many>, C<many_to_many> and 'multi' type
ec353f53 887relationships.>
888
dad42de6 889=head3 has_many / multi
890
ec353f53 891=over 4
892
dad42de6 893=item Arguments: \%col_data
894
895=item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
896
897=back
898
899Creates/inserts a new result object. Internally, this calls:
900
901 $self->create_related($rel, @_)
902
903And returns the result of that.
904
905=head3 many_to_many
906
907=over 4
908
909=item Arguments: (\%col_data | L<$result|DBIx::Class::Manual::ResultClass>), \%link_col_data?
910
911=item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
ec353f53 912
913=back
914
915 my $role = $schema->resultset('Role')->find(1);
916 $actor->add_to_roles($role);
dad42de6 917 # creates a My::DBIC::Schema::ActorRoles linking table result object
ec353f53 918
919 $actor->add_to_roles({ name => 'lead' }, { salary => 15_000_000 });
dad42de6 920 # creates a new My::DBIC::Schema::Role result object and the linking table
ec353f53 921 # object with an extra column in the link
922
dad42de6 923Adds a linking table object. If the first argument is a hash reference, the
924related object is created first with the column values in the hash. If an object
925reference is given, just the linking table object is created. In either case,
926any additional column values for the linking table object can be specified in
927C<\%link_col_data>.
928
929See L<DBIx::Class::Relationship/many_to_many> for additional details.
ec353f53 930
931=head2 set_$rel
932
dad42de6 933B<Currently only available for C<many_to_many> relationships.>
ec353f53 934
935=over 4
936
dad42de6 937=item Arguments: (\@hashrefs_of_col_data | L<\@result_objs|DBIx::Class::Manual::ResultClass>), $link_vals?
938
939=item Return Value: not defined
ec353f53 940
941=back
942
943 my $actor = $schema->resultset('Actor')->find(1);
fd323bf1 944 my @roles = $schema->resultset('Role')->search({ role =>
debccec3 945 { '-in' => ['Fred', 'Barney'] } } );
ec353f53 946
4d3a827d 947 $actor->set_roles(\@roles);
948 # Replaces all of $actor's previous roles with the two named
ec353f53 949
ac36a402 950 $actor->set_roles(\@roles, { salary => 15_000_000 });
951 # Sets a column in the link table for all roles
952
953
4d3a827d 954Replace all the related objects with the given reference to a list of
955objects. This does a C<delete> B<on the link table resultset> to remove the
956association between the current object and all related objects, then calls
957C<add_to_$rel> repeatedly to link all the new objects.
bba68c67 958
959Note that this means that this method will B<not> delete any objects in the
960table on the right side of the relation, merely that it will delete the link
961between them.
ec353f53 962
4d3a827d 963Due to a mistake in the original implementation of this method, it will also
964accept a list of objects or hash references. This is B<deprecated> and will be
965removed in a future version.
966
ec353f53 967=head2 remove_from_$rel
968
dad42de6 969B<Currently only available for C<many_to_many> relationships.>
ec353f53 970
971=over 4
972
dad42de6 973=item Arguments: L<$result|DBIx::Class::Manual::ResultClass>
974
975=item Return Value: not defined
ec353f53 976
977=back
978
979 my $role = $schema->resultset('Role')->find(1);
980 $actor->remove_from_roles($role);
dad42de6 981 # removes $role's My::DBIC::Schema::ActorRoles linking table result object
ec353f53 982
983Removes the link between the current object and the related object. Note that
984the related object itself won't be deleted unless you call ->delete() on
985it. This method just removes the link between the two objects.
986
a2bd3796 987=head1 FURTHER QUESTIONS?
55e2d745 988
a2bd3796 989Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
55e2d745 990
a2bd3796 991=head1 COPYRIGHT AND LICENSE
55e2d745 992
a2bd3796 993This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
994by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
995redistribute it and/or modify it under the same terms as the
996L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
55e2d745 997
998=cut
999
4d87db01 10001;