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