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