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