Clarification to cascade_update attribute documentation
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship / Base.pm
CommitLineData
55e2d745 1package DBIx::Class::Relationship::Base;
2
3use strict;
4use warnings;
5
9eb32892 6use Scalar::Util ();
1edd1722 7use base qw/DBIx::Class/;
55e2d745 8
75d07914 9=head1 NAME
55e2d745 10
8918977e 11DBIx::Class::Relationship::Base - Inter-table relationships
55e2d745 12
13=head1 SYNOPSIS
14
15=head1 DESCRIPTION
16
30236e47 17This class provides methods to describe the relationships between the
18tables in your database model. These are the "bare bones" relationships
75d07914 19methods, for predefined ones, look in L<DBIx::Class::Relationship>.
55e2d745 20
21=head1 METHODS
22
8091aa91 23=head2 add_relationship
503536d5 24
27f01d1f 25=over 4
26
ebc77b53 27=item Arguments: 'relname', 'Foreign::Class', $cond, $attrs
27f01d1f 28
29=back
30236e47 30
503536d5 31 __PACKAGE__->add_relationship('relname', 'Foreign::Class', $cond, $attrs);
32
406734bb 33=head3 condition
34
5271499d 35The condition needs to be an L<SQL::Abstract>-style representation of the
36join between the tables. When resolving the condition for use in a C<JOIN>,
37keys using the pseudo-table C<foreign> are resolved to mean "the Table on the
38other side of the relationship", and values using the pseudo-table C<self>
30236e47 39are resolved to mean "the Table this class is representing". Other
40restrictions, such as by value, sub-select and other tables, may also be
5271499d 41used. Please check your database for C<JOIN> parameter support.
30236e47 42
5271499d 43For example, if you're creating a relationship from C<Author> to C<Book>, where
44the C<Book> table has a column C<author_id> containing the ID of the C<Author>
45row:
503536d5 46
30236e47 47 { 'foreign.author_id' => 'self.id' }
503536d5 48
5271499d 49will result in the C<JOIN> clause
503536d5 50
5271499d 51 author me JOIN book book ON book.author_id = me.id
503536d5 52
5271499d 53For multi-column foreign keys, you will need to specify a C<foreign>-to-C<self>
54mapping for each column in the key. For example, if you're creating a
55relationship from C<Book> to C<Edition>, where the C<Edition> table refers to a
56publisher and a type (e.g. "paperback"):
57
58 {
781102cd 59 'foreign.publisher_id' => 'self.publisher_id',
5271499d 60 'foreign.type_id' => 'self.type_id',
61 }
62
63This will result in the C<JOIN> clause:
64
65 book me JOIN edition edition ON edition.publisher_id = me.publisher_id
66 AND edition.type_id = me.type_id
67
68Each key-value pair provided in a hashref will be used as C<AND>ed conditions.
69To add an C<OR>ed condition, use an arrayref of hashrefs. See the
70L<SQL::Abstract> documentation for more details.
8091aa91 71
406734bb 72=head3 attributes
73
74The L<standard ResultSet attributes|DBIx::Class::ResultSet/ATTRIBUTES> may
75be used as relationship attributes. In particular, the 'where' attribute is
76useful for filtering relationships:
77
78 __PACKAGE__->has_many( 'valid_users', 'MyApp::Schema::User',
79 { 'foreign.user_id' => 'self.user_id' },
80 { where => { valid => 1 } }
81 );
82
83The following attributes are also valid:
8091aa91 84
85=over 4
86
87=item join_type
88
89Explicitly specifies the type of join to use in the relationship. Any SQL
90join type is valid, e.g. C<LEFT> or C<RIGHT>. It will be placed in the SQL
91command immediately before C<JOIN>.
92
93=item proxy
94
30236e47 95An arrayref containing a list of accessors in the foreign class to create in
8091aa91 96the main class. If, for example, you do the following:
d4daee7b 97
27f01d1f 98 MyDB::Schema::CD->might_have(liner_notes => 'MyDB::Schema::LinerNotes',
99 undef, {
100 proxy => [ qw/notes/ ],
101 });
d4daee7b 102
30236e47 103Then, assuming MyDB::Schema::LinerNotes has an accessor named notes, you can do:
8091aa91 104
30236e47 105 my $cd = MyDB::Schema::CD->find(1);
106 $cd->notes('Notes go here'); # set notes -- LinerNotes object is
107 # created if it doesn't exist
d4daee7b 108
8091aa91 109=item accessor
110
111Specifies the type of accessor that should be created for the relationship.
112Valid values are C<single> (for when there is only a single related object),
113C<multi> (when there can be many), and C<filter> (for when there is a single
114related object, but you also want the relationship accessor to double as
115a column accessor). For C<multi> accessors, an add_to_* method is also
116created, which calls C<create_related> for the relationship.
117
3d618782 118=item is_foreign_key_constraint
119
120If you are using L<SQL::Translator> to create SQL for you and you find that it
121is creating constraints where it shouldn't, or not creating them where it
122should, set this attribute to a true or false value to override the detection
123of when to create constraints.
124
5f7ac523 125=item cascade_copy
126
127If C<cascade_copy> is true on a C<has_many> relationship for an
128object, then when you copy the object all the related objects will
129be copied too. To turn this behaviour off, pass C<< cascade_copy => 0 >>
130in the C<$attr> hashref. The behaviour defaults to C<< cascade_copy => 1 >>.
131
132=item cascade_delete
133
134By default, DBIx::Class cascades deletes across C<has_many> and
135C<might_have> relationships. You can disable this behaviour on a
136per-relationship basis by supplying C<< cascade_delete => 0 >> in the
137relationship attributes.
138
139The cascaded operations are performed after the requested delete,
140so if your database has a constraint on the relationship, it will
141have deleted/updated the related records or raised an exception
142before DBIx::Class gets to perform the cascaded operation.
143
144=item cascade_update
145
146By default, DBIx::Class cascades updates across C<has_many> and
147C<might_have> relationships. You can disable this behaviour on a
148per-relationship basis by supplying C<< cascade_update => 0 >> in the
149relationship attributes.
150
cee0c9b1 151This is not a RDMS style cascade update - it purely means that when
152an object has update called on it, all the related objects also
153have update called. It will not change foreign keys automatically -
154you must arrange to do this yourself.
5f7ac523 155
e377d723 156=item on_delete / on_update
157
158If you are using L<SQL::Translator> to create SQL for you, you can use these
159attributes to explicitly set the desired C<ON DELETE> or C<ON UPDATE> constraint
160type. If not supplied the SQLT parser will attempt to infer the constraint type by
161interrogating the attributes of the B<opposite> relationship. For any 'multi'
162relationship with C<< cascade_delete => 1 >>, the corresponding belongs_to
163relationship will be created with an C<ON DELETE CASCADE> constraint. For any
164relationship bearing C<< cascade_copy => 1 >> the resulting belongs_to constraint
165will be C<ON UPDATE CASCADE>. If you wish to disable this autodetection, and just
166use the RDBMS' default constraint type, pass C<< on_delete => undef >> or
167C<< on_delete => '' >>, and the same for C<on_update> respectively.
168
13de943d 169=item is_deferrable
170
171Tells L<SQL::Translator> that the foreign key constraint it creates should be
172deferrable. In other words, the user may request that the constraint be ignored
173until the end of the transaction. Currently, only the PostgreSQL producer
174actually supports this.
175
2581038c 176=item add_fk_index
177
178Tells L<SQL::Translator> to add an index for this constraint. Can also be
179specified globally in the args to L<DBIx::Class::Schema/deploy> or
180L<DBIx::Class::Schema/create_ddl_dir>. Default is on, set to 0 to disable.
181
8091aa91 182=back
183
87c4e602 184=head2 register_relationship
185
27f01d1f 186=over 4
187
ebc77b53 188=item Arguments: $relname, $rel_info
27f01d1f 189
190=back
71e65b39 191
30236e47 192Registers a relationship on the class. This is called internally by
71f9df37 193DBIx::Class::ResultSourceProxy to set up Accessors and Proxies.
71e65b39 194
55e2d745 195=cut
196
71e65b39 197sub register_relationship { }
198
27f01d1f 199=head2 related_resultset
200
201=over 4
202
ebc77b53 203=item Arguments: $relationship_name
27f01d1f 204
d601dc88 205=item Return Value: $related_resultset
27f01d1f 206
207=back
30236e47 208
27f01d1f 209 $rs = $cd->related_resultset('artist');
30236e47 210
27f01d1f 211Returns a L<DBIx::Class::ResultSet> for the relationship named
212$relationship_name.
30236e47 213
214=cut
215
216sub related_resultset {
217 my $self = shift;
bc0c9800 218 $self->throw_exception("Can't call *_related as class methods")
219 unless ref $self;
30236e47 220 my $rel = shift;
164efde3 221 my $rel_info = $self->relationship_info($rel);
bc0c9800 222 $self->throw_exception( "No such relationship ${rel}" )
164efde3 223 unless $rel_info;
d4daee7b 224
30236e47 225 return $self->{related_resultsets}{$rel} ||= do {
226 my $attrs = (@_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {});
164efde3 227 $attrs = { %{$rel_info->{attrs} || {}}, %$attrs };
30236e47 228
bc0c9800 229 $self->throw_exception( "Invalid query: @_" )
230 if (@_ > 1 && (@_ % 2 == 1));
30236e47 231 my $query = ((@_ > 1) ? {@_} : shift);
232
68f3b0dd 233 my $source = $self->result_source;
d419ded6 234
235 # condition resolution may fail if an incomplete master-object prefetch
34b6b86f 236 # is encountered - that is ok during prefetch construction (not yet in_storage)
237 my $cond = eval { $source->_resolve_condition( $rel_info->{cond}, $rel, $self ) };
238 if (my $err = $@) {
239 if ($self->in_storage) {
240 $self->throw_exception ($err);
241 }
242 else {
243 $cond = $DBIx::Class::ResultSource::UNRESOLVABLE_CONDITION;
244 }
245 }
d419ded6 246
68f3b0dd 247 if ($cond eq $DBIx::Class::ResultSource::UNRESOLVABLE_CONDITION) {
248 my $reverse = $source->reverse_relationship_info($rel);
249 foreach my $rev_rel (keys %$reverse) {
b82c8a28 250 if ($reverse->{$rev_rel}{attrs}{accessor} && $reverse->{$rev_rel}{attrs}{accessor} eq 'multi') {
2c5c07ec 251 $attrs->{related_objects}{$rev_rel} = [ $self ];
252 Scalar::Util::weaken($attrs->{related_object}{$rev_rel}[0]);
253 } else {
254 $attrs->{related_objects}{$rev_rel} = $self;
255 Scalar::Util::weaken($attrs->{related_object}{$rev_rel});
256 }
68f3b0dd 257 }
258 }
30236e47 259 if (ref $cond eq 'ARRAY') {
370f2ba2 260 $cond = [ map {
261 if (ref $_ eq 'HASH') {
262 my $hash;
263 foreach my $key (keys %$_) {
47752afe 264 my $newkey = $key !~ /\./ ? "me.$key" : $key;
370f2ba2 265 $hash->{$newkey} = $_->{$key};
266 }
267 $hash;
268 } else {
269 $_;
270 }
271 } @$cond ];
68f3b0dd 272 } elsif (ref $cond eq 'HASH') {
30236e47 273 foreach my $key (grep { ! /\./ } keys %$cond) {
274 $cond->{"me.$key"} = delete $cond->{$key};
275 }
276 }
277 $query = ($query ? { '-and' => [ $cond, $query ] } : $cond);
bc0c9800 278 $self->result_source->related_source($rel)->resultset->search(
279 $query, $attrs
280 );
30236e47 281 };
282}
283
8091aa91 284=head2 search_related
503536d5 285
5b89a768 286 @objects = $rs->search_related('relname', $cond, $attrs);
287 $objects_rs = $rs->search_related('relname', $cond, $attrs);
30236e47 288
289Run a search on a related resultset. The search will be restricted to the
290item or items represented by the L<DBIx::Class::ResultSet> it was called
291upon. This method can be called on a ResultSet, a Row or a ResultSource class.
503536d5 292
293=cut
294
55e2d745 295sub search_related {
ff7bb7a1 296 return shift->related_resultset(shift)->search(@_);
b52e9bf8 297}
298
5b89a768 299=head2 search_related_rs
300
301 ( $objects_rs ) = $rs->search_related_rs('relname', $cond, $attrs);
302
60a8fb95 303This method works exactly the same as search_related, except that
48580715 304it guarantees a resultset, even in list context.
5b89a768 305
306=cut
307
308sub search_related_rs {
309 return shift->related_resultset(shift)->search_rs(@_);
310}
311
b52e9bf8 312=head2 count_related
313
7be93b07 314 $obj->count_related('relname', $cond, $attrs);
b52e9bf8 315
bc0c9800 316Returns the count of all the items in the related resultset, restricted by the
317current item or where conditions. Can be called on a
27f01d1f 318L<DBIx::Class::Manual::Glossary/"ResultSet"> or a
bc0c9800 319L<DBIx::Class::Manual::Glossary/"Row"> object.
30236e47 320
b52e9bf8 321=cut
322
323sub count_related {
324 my $self = shift;
325 return $self->search_related(@_)->count;
55e2d745 326}
327
30236e47 328=head2 new_related
329
330 my $new_obj = $obj->new_related('relname', \%col_data);
331
332Create a new item of the related foreign class. If called on a
aaaa048e 333L<Row|DBIx::Class::Manual::Glossary/"Row"> object, it will magically
479b2a6a 334set any foreign key columns of the new object to the related primary
335key columns of the source object for you. The newly created item will
336not be saved into your storage until you call L<DBIx::Class::Row/insert>
30236e47 337on it.
338
339=cut
340
341sub new_related {
342 my ($self, $rel, $values, $attrs) = @_;
343 return $self->search_related($rel)->new($values, $attrs);
344}
345
8091aa91 346=head2 create_related
503536d5 347
30236e47 348 my $new_obj = $obj->create_related('relname', \%col_data);
349
350Creates a new item, similarly to new_related, and also inserts the item's data
351into your storage medium. See the distinction between C<create> and C<new>
352in L<DBIx::Class::ResultSet> for details.
503536d5 353
354=cut
355
55e2d745 356sub create_related {
3842b955 357 my $self = shift;
fea3d045 358 my $rel = shift;
64acc2bc 359 my $obj = $self->search_related($rel)->create(@_);
360 delete $self->{related_resultsets}->{$rel};
361 return $obj;
55e2d745 362}
363
8091aa91 364=head2 find_related
503536d5 365
30236e47 366 my $found_item = $obj->find_related('relname', @pri_vals | \%pri_vals);
367
368Attempt to find a related object using its primary key or unique constraints.
27f01d1f 369See L<DBIx::Class::ResultSet/find> for details.
503536d5 370
371=cut
372
1a14aa3f 373sub find_related {
374 my $self = shift;
375 my $rel = shift;
716b3d29 376 return $self->search_related($rel)->find(@_);
1a14aa3f 377}
378
b3e1f1f5 379=head2 find_or_new_related
380
381 my $new_obj = $obj->find_or_new_related('relname', \%col_data);
382
383Find an item of a related class. If none exists, instantiate a new item of the
384related class. The object will not be saved into your storage until you call
385L<DBIx::Class::Row/insert> on it.
386
387=cut
388
389sub find_or_new_related {
390 my $self = shift;
e60dc79f 391 my $obj = $self->find_related(@_);
392 return defined $obj ? $obj : $self->new_related(@_);
b3e1f1f5 393}
394
8091aa91 395=head2 find_or_create_related
503536d5 396
30236e47 397 my $new_obj = $obj->find_or_create_related('relname', \%col_data);
398
27f01d1f 399Find or create an item of a related class. See
b3e1f1f5 400L<DBIx::Class::ResultSet/find_or_create> for details.
503536d5 401
402=cut
403
55e2d745 404sub find_or_create_related {
405 my $self = shift;
9c2c91ea 406 my $obj = $self->find_related(@_);
407 return (defined($obj) ? $obj : $self->create_related(@_));
55e2d745 408}
409
045120e6 410=head2 update_or_create_related
411
412 my $updated_item = $obj->update_or_create_related('relname', \%col_data, \%attrs?);
413
414Update or create an item of a related class. See
f7e1846f 415L<DBIx::Class::ResultSet/update_or_create> for details.
045120e6 416
417=cut
418
419sub update_or_create_related {
420 my $self = shift;
421 my $rel = shift;
422 return $self->related_resultset($rel)->update_or_create(@_);
423}
424
8091aa91 425=head2 set_from_related
503536d5 426
30236e47 427 $book->set_from_related('author', $author_obj);
ac8e89d7 428 $book->author($author_obj); ## same thing
30236e47 429
430Set column values on the current object, using related values from the given
431related object. This is used to associate previously separate objects, for
432example, to set the correct author for a book, find the Author object, then
433call set_from_related on the book.
434
ac8e89d7 435This is called internally when you pass existing objects as values to
48580715 436L<DBIx::Class::ResultSet/create>, or pass an object to a belongs_to accessor.
ac8e89d7 437
27f01d1f 438The columns are only set in the local copy of the object, call L</update> to
439set them in the storage.
503536d5 440
441=cut
442
55e2d745 443sub set_from_related {
444 my ($self, $rel, $f_obj) = @_;
164efde3 445 my $rel_info = $self->relationship_info($rel);
446 $self->throw_exception( "No such relationship ${rel}" ) unless $rel_info;
447 my $cond = $rel_info->{cond};
bc0c9800 448 $self->throw_exception(
449 "set_from_related can only handle a hash condition; the ".
450 "condition for $rel is of type ".
451 (ref $cond ? ref $cond : 'plain scalar')
452 ) unless ref $cond eq 'HASH';
2c037e6b 453 if (defined $f_obj) {
164efde3 454 my $f_class = $rel_info->{class};
2c037e6b 455 $self->throw_exception( "Object $f_obj isn't a ".$f_class )
9eb32892 456 unless Scalar::Util::blessed($f_obj) and $f_obj->isa($f_class);
2c037e6b 457 }
fde6e28e 458 $self->set_columns(
6d0ee587 459 $self->result_source->_resolve_condition(
164efde3 460 $rel_info->{cond}, $f_obj, $rel));
55e2d745 461 return 1;
462}
463
8091aa91 464=head2 update_from_related
503536d5 465
30236e47 466 $book->update_from_related('author', $author_obj);
467
27f01d1f 468The same as L</"set_from_related">, but the changes are immediately updated
469in storage.
503536d5 470
471=cut
472
55e2d745 473sub update_from_related {
474 my $self = shift;
475 $self->set_from_related(@_);
476 $self->update;
477}
478
8091aa91 479=head2 delete_related
503536d5 480
30236e47 481 $obj->delete_related('relname', $cond, $attrs);
482
483Delete any related item subject to the given conditions.
503536d5 484
485=cut
486
55e2d745 487sub delete_related {
488 my $self = shift;
64acc2bc 489 my $obj = $self->search_related(@_)->delete;
490 delete $self->{related_resultsets}->{$_[0]};
491 return $obj;
55e2d745 492}
493
ec353f53 494=head2 add_to_$rel
495
496B<Currently only available for C<has_many>, C<many-to-many> and 'multi' type
497relationships.>
498
499=over 4
500
501=item Arguments: ($foreign_vals | $obj), $link_vals?
502
503=back
504
505 my $role = $schema->resultset('Role')->find(1);
506 $actor->add_to_roles($role);
507 # creates a My::DBIC::Schema::ActorRoles linking table row object
508
509 $actor->add_to_roles({ name => 'lead' }, { salary => 15_000_000 });
510 # creates a new My::DBIC::Schema::Role row object and the linking table
511 # object with an extra column in the link
512
513Adds a linking table object for C<$obj> or C<$foreign_vals>. If the first
514argument is a hash reference, the related object is created first with the
515column values in the hash. If an object reference is given, just the linking
516table object is created. In either case, any additional column values for the
517linking table object can be specified in C<$link_vals>.
518
519=head2 set_$rel
520
521B<Currently only available for C<many-to-many> relationships.>
522
523=over 4
524
ac36a402 525=item Arguments: (\@hashrefs | \@objs), $link_vals?
ec353f53 526
527=back
528
529 my $actor = $schema->resultset('Actor')->find(1);
530 my @roles = $schema->resultset('Role')->search({ role =>
debccec3 531 { '-in' => ['Fred', 'Barney'] } } );
ec353f53 532
4d3a827d 533 $actor->set_roles(\@roles);
534 # Replaces all of $actor's previous roles with the two named
ec353f53 535
ac36a402 536 $actor->set_roles(\@roles, { salary => 15_000_000 });
537 # Sets a column in the link table for all roles
538
539
4d3a827d 540Replace all the related objects with the given reference to a list of
541objects. This does a C<delete> B<on the link table resultset> to remove the
542association between the current object and all related objects, then calls
543C<add_to_$rel> repeatedly to link all the new objects.
bba68c67 544
545Note that this means that this method will B<not> delete any objects in the
546table on the right side of the relation, merely that it will delete the link
547between them.
ec353f53 548
4d3a827d 549Due to a mistake in the original implementation of this method, it will also
550accept a list of objects or hash references. This is B<deprecated> and will be
551removed in a future version.
552
ec353f53 553=head2 remove_from_$rel
554
555B<Currently only available for C<many-to-many> relationships.>
556
557=over 4
558
559=item Arguments: $obj
560
561=back
562
563 my $role = $schema->resultset('Role')->find(1);
564 $actor->remove_from_roles($role);
565 # removes $role's My::DBIC::Schema::ActorRoles linking table row object
566
567Removes the link between the current object and the related object. Note that
568the related object itself won't be deleted unless you call ->delete() on
569it. This method just removes the link between the two objects.
570
55e2d745 571=head1 AUTHORS
572
daec44b8 573Matt S. Trout <mst@shadowcatsystems.co.uk>
55e2d745 574
575=head1 LICENSE
576
577You may distribute this code under the same terms as Perl itself.
578
579=cut
580
4d87db01 5811;