eval => try where tests for $@ done
[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 >>
b7bbc39f 130in the C<$attr> hashref.
131
132The behaviour defaults to C<< cascade_copy => 1 >> for C<has_many>
133relationships.
5f7ac523 134
135=item cascade_delete
136
b7bbc39f 137By default, DBIx::Class cascades deletes across C<has_many>,
138C<has_one> and C<might_have> relationships. You can disable this
139behaviour on a per-relationship basis by supplying
140C<< cascade_delete => 0 >> in the relationship attributes.
5f7ac523 141
142The cascaded operations are performed after the requested delete,
143so if your database has a constraint on the relationship, it will
144have deleted/updated the related records or raised an exception
145before DBIx::Class gets to perform the cascaded operation.
146
147=item cascade_update
148
b7bbc39f 149By default, DBIx::Class cascades updates across C<has_one> and
5f7ac523 150C<might_have> relationships. You can disable this behaviour on a
b7bbc39f 151per-relationship basis by supplying C<< cascade_update => 0 >> in
152the relationship attributes.
5f7ac523 153
cee0c9b1 154This is not a RDMS style cascade update - it purely means that when
155an object has update called on it, all the related objects also
156have update called. It will not change foreign keys automatically -
157you must arrange to do this yourself.
5f7ac523 158
e377d723 159=item on_delete / on_update
160
161If you are using L<SQL::Translator> to create SQL for you, you can use these
162attributes to explicitly set the desired C<ON DELETE> or C<ON UPDATE> constraint
163type. If not supplied the SQLT parser will attempt to infer the constraint type by
164interrogating the attributes of the B<opposite> relationship. For any 'multi'
165relationship with C<< cascade_delete => 1 >>, the corresponding belongs_to
166relationship will be created with an C<ON DELETE CASCADE> constraint. For any
167relationship bearing C<< cascade_copy => 1 >> the resulting belongs_to constraint
168will be C<ON UPDATE CASCADE>. If you wish to disable this autodetection, and just
169use the RDBMS' default constraint type, pass C<< on_delete => undef >> or
170C<< on_delete => '' >>, and the same for C<on_update> respectively.
171
13de943d 172=item is_deferrable
173
174Tells L<SQL::Translator> that the foreign key constraint it creates should be
175deferrable. In other words, the user may request that the constraint be ignored
176until the end of the transaction. Currently, only the PostgreSQL producer
177actually supports this.
178
2581038c 179=item add_fk_index
180
181Tells L<SQL::Translator> to add an index for this constraint. Can also be
182specified globally in the args to L<DBIx::Class::Schema/deploy> or
183L<DBIx::Class::Schema/create_ddl_dir>. Default is on, set to 0 to disable.
184
8091aa91 185=back
186
87c4e602 187=head2 register_relationship
188
27f01d1f 189=over 4
190
ebc77b53 191=item Arguments: $relname, $rel_info
27f01d1f 192
193=back
71e65b39 194
30236e47 195Registers a relationship on the class. This is called internally by
71f9df37 196DBIx::Class::ResultSourceProxy to set up Accessors and Proxies.
71e65b39 197
55e2d745 198=cut
199
71e65b39 200sub register_relationship { }
201
27f01d1f 202=head2 related_resultset
203
204=over 4
205
ebc77b53 206=item Arguments: $relationship_name
27f01d1f 207
d601dc88 208=item Return Value: $related_resultset
27f01d1f 209
210=back
30236e47 211
27f01d1f 212 $rs = $cd->related_resultset('artist');
30236e47 213
27f01d1f 214Returns a L<DBIx::Class::ResultSet> for the relationship named
215$relationship_name.
30236e47 216
217=cut
218
219sub related_resultset {
220 my $self = shift;
bc0c9800 221 $self->throw_exception("Can't call *_related as class methods")
222 unless ref $self;
30236e47 223 my $rel = shift;
164efde3 224 my $rel_info = $self->relationship_info($rel);
bc0c9800 225 $self->throw_exception( "No such relationship ${rel}" )
164efde3 226 unless $rel_info;
d4daee7b 227
30236e47 228 return $self->{related_resultsets}{$rel} ||= do {
229 my $attrs = (@_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {});
164efde3 230 $attrs = { %{$rel_info->{attrs} || {}}, %$attrs };
30236e47 231
bc0c9800 232 $self->throw_exception( "Invalid query: @_" )
233 if (@_ > 1 && (@_ % 2 == 1));
30236e47 234 my $query = ((@_ > 1) ? {@_} : shift);
235
68f3b0dd 236 my $source = $self->result_source;
d419ded6 237
238 # condition resolution may fail if an incomplete master-object prefetch
34b6b86f 239 # is encountered - that is ok during prefetch construction (not yet in_storage)
240 my $cond = eval { $source->_resolve_condition( $rel_info->{cond}, $rel, $self ) };
241 if (my $err = $@) {
242 if ($self->in_storage) {
243 $self->throw_exception ($err);
244 }
245 else {
246 $cond = $DBIx::Class::ResultSource::UNRESOLVABLE_CONDITION;
247 }
248 }
d419ded6 249
68f3b0dd 250 if ($cond eq $DBIx::Class::ResultSource::UNRESOLVABLE_CONDITION) {
251 my $reverse = $source->reverse_relationship_info($rel);
252 foreach my $rev_rel (keys %$reverse) {
b82c8a28 253 if ($reverse->{$rev_rel}{attrs}{accessor} && $reverse->{$rev_rel}{attrs}{accessor} eq 'multi') {
2c5c07ec 254 $attrs->{related_objects}{$rev_rel} = [ $self ];
255 Scalar::Util::weaken($attrs->{related_object}{$rev_rel}[0]);
256 } else {
257 $attrs->{related_objects}{$rev_rel} = $self;
258 Scalar::Util::weaken($attrs->{related_object}{$rev_rel});
259 }
68f3b0dd 260 }
261 }
30236e47 262 if (ref $cond eq 'ARRAY') {
370f2ba2 263 $cond = [ map {
264 if (ref $_ eq 'HASH') {
265 my $hash;
266 foreach my $key (keys %$_) {
47752afe 267 my $newkey = $key !~ /\./ ? "me.$key" : $key;
370f2ba2 268 $hash->{$newkey} = $_->{$key};
269 }
270 $hash;
271 } else {
272 $_;
273 }
274 } @$cond ];
68f3b0dd 275 } elsif (ref $cond eq 'HASH') {
30236e47 276 foreach my $key (grep { ! /\./ } keys %$cond) {
277 $cond->{"me.$key"} = delete $cond->{$key};
278 }
279 }
280 $query = ($query ? { '-and' => [ $cond, $query ] } : $cond);
bc0c9800 281 $self->result_source->related_source($rel)->resultset->search(
282 $query, $attrs
283 );
30236e47 284 };
285}
286
8091aa91 287=head2 search_related
503536d5 288
5b89a768 289 @objects = $rs->search_related('relname', $cond, $attrs);
290 $objects_rs = $rs->search_related('relname', $cond, $attrs);
30236e47 291
292Run a search on a related resultset. The search will be restricted to the
293item or items represented by the L<DBIx::Class::ResultSet> it was called
294upon. This method can be called on a ResultSet, a Row or a ResultSource class.
503536d5 295
296=cut
297
55e2d745 298sub search_related {
ff7bb7a1 299 return shift->related_resultset(shift)->search(@_);
b52e9bf8 300}
301
5b89a768 302=head2 search_related_rs
303
304 ( $objects_rs ) = $rs->search_related_rs('relname', $cond, $attrs);
305
60a8fb95 306This method works exactly the same as search_related, except that
48580715 307it guarantees a resultset, even in list context.
5b89a768 308
309=cut
310
311sub search_related_rs {
312 return shift->related_resultset(shift)->search_rs(@_);
313}
314
b52e9bf8 315=head2 count_related
316
7be93b07 317 $obj->count_related('relname', $cond, $attrs);
b52e9bf8 318
bc0c9800 319Returns the count of all the items in the related resultset, restricted by the
320current item or where conditions. Can be called on a
27f01d1f 321L<DBIx::Class::Manual::Glossary/"ResultSet"> or a
bc0c9800 322L<DBIx::Class::Manual::Glossary/"Row"> object.
30236e47 323
b52e9bf8 324=cut
325
326sub count_related {
327 my $self = shift;
328 return $self->search_related(@_)->count;
55e2d745 329}
330
30236e47 331=head2 new_related
332
333 my $new_obj = $obj->new_related('relname', \%col_data);
334
335Create a new item of the related foreign class. If called on a
aaaa048e 336L<Row|DBIx::Class::Manual::Glossary/"Row"> object, it will magically
479b2a6a 337set any foreign key columns of the new object to the related primary
338key columns of the source object for you. The newly created item will
339not be saved into your storage until you call L<DBIx::Class::Row/insert>
30236e47 340on it.
341
342=cut
343
344sub new_related {
345 my ($self, $rel, $values, $attrs) = @_;
346 return $self->search_related($rel)->new($values, $attrs);
347}
348
8091aa91 349=head2 create_related
503536d5 350
30236e47 351 my $new_obj = $obj->create_related('relname', \%col_data);
352
353Creates a new item, similarly to new_related, and also inserts the item's data
354into your storage medium. See the distinction between C<create> and C<new>
355in L<DBIx::Class::ResultSet> for details.
503536d5 356
357=cut
358
55e2d745 359sub create_related {
3842b955 360 my $self = shift;
fea3d045 361 my $rel = shift;
64acc2bc 362 my $obj = $self->search_related($rel)->create(@_);
363 delete $self->{related_resultsets}->{$rel};
364 return $obj;
55e2d745 365}
366
8091aa91 367=head2 find_related
503536d5 368
30236e47 369 my $found_item = $obj->find_related('relname', @pri_vals | \%pri_vals);
370
371Attempt to find a related object using its primary key or unique constraints.
27f01d1f 372See L<DBIx::Class::ResultSet/find> for details.
503536d5 373
374=cut
375
1a14aa3f 376sub find_related {
377 my $self = shift;
378 my $rel = shift;
716b3d29 379 return $self->search_related($rel)->find(@_);
1a14aa3f 380}
381
b3e1f1f5 382=head2 find_or_new_related
383
384 my $new_obj = $obj->find_or_new_related('relname', \%col_data);
385
386Find an item of a related class. If none exists, instantiate a new item of the
387related class. The object will not be saved into your storage until you call
388L<DBIx::Class::Row/insert> on it.
389
390=cut
391
392sub find_or_new_related {
393 my $self = shift;
e60dc79f 394 my $obj = $self->find_related(@_);
395 return defined $obj ? $obj : $self->new_related(@_);
b3e1f1f5 396}
397
8091aa91 398=head2 find_or_create_related
503536d5 399
30236e47 400 my $new_obj = $obj->find_or_create_related('relname', \%col_data);
401
27f01d1f 402Find or create an item of a related class. See
b3e1f1f5 403L<DBIx::Class::ResultSet/find_or_create> for details.
503536d5 404
405=cut
406
55e2d745 407sub find_or_create_related {
408 my $self = shift;
9c2c91ea 409 my $obj = $self->find_related(@_);
410 return (defined($obj) ? $obj : $self->create_related(@_));
55e2d745 411}
412
045120e6 413=head2 update_or_create_related
414
415 my $updated_item = $obj->update_or_create_related('relname', \%col_data, \%attrs?);
416
417Update or create an item of a related class. See
f7e1846f 418L<DBIx::Class::ResultSet/update_or_create> for details.
045120e6 419
420=cut
421
422sub update_or_create_related {
423 my $self = shift;
424 my $rel = shift;
425 return $self->related_resultset($rel)->update_or_create(@_);
426}
427
8091aa91 428=head2 set_from_related
503536d5 429
30236e47 430 $book->set_from_related('author', $author_obj);
ac8e89d7 431 $book->author($author_obj); ## same thing
30236e47 432
433Set column values on the current object, using related values from the given
434related object. This is used to associate previously separate objects, for
435example, to set the correct author for a book, find the Author object, then
436call set_from_related on the book.
437
ac8e89d7 438This is called internally when you pass existing objects as values to
48580715 439L<DBIx::Class::ResultSet/create>, or pass an object to a belongs_to accessor.
ac8e89d7 440
27f01d1f 441The columns are only set in the local copy of the object, call L</update> to
442set them in the storage.
503536d5 443
444=cut
445
55e2d745 446sub set_from_related {
447 my ($self, $rel, $f_obj) = @_;
164efde3 448 my $rel_info = $self->relationship_info($rel);
449 $self->throw_exception( "No such relationship ${rel}" ) unless $rel_info;
450 my $cond = $rel_info->{cond};
bc0c9800 451 $self->throw_exception(
452 "set_from_related can only handle a hash condition; the ".
453 "condition for $rel is of type ".
454 (ref $cond ? ref $cond : 'plain scalar')
455 ) unless ref $cond eq 'HASH';
2c037e6b 456 if (defined $f_obj) {
164efde3 457 my $f_class = $rel_info->{class};
2c037e6b 458 $self->throw_exception( "Object $f_obj isn't a ".$f_class )
9eb32892 459 unless Scalar::Util::blessed($f_obj) and $f_obj->isa($f_class);
2c037e6b 460 }
fde6e28e 461 $self->set_columns(
6d0ee587 462 $self->result_source->_resolve_condition(
164efde3 463 $rel_info->{cond}, $f_obj, $rel));
55e2d745 464 return 1;
465}
466
8091aa91 467=head2 update_from_related
503536d5 468
30236e47 469 $book->update_from_related('author', $author_obj);
470
27f01d1f 471The same as L</"set_from_related">, but the changes are immediately updated
472in storage.
503536d5 473
474=cut
475
55e2d745 476sub update_from_related {
477 my $self = shift;
478 $self->set_from_related(@_);
479 $self->update;
480}
481
8091aa91 482=head2 delete_related
503536d5 483
30236e47 484 $obj->delete_related('relname', $cond, $attrs);
485
486Delete any related item subject to the given conditions.
503536d5 487
488=cut
489
55e2d745 490sub delete_related {
491 my $self = shift;
64acc2bc 492 my $obj = $self->search_related(@_)->delete;
493 delete $self->{related_resultsets}->{$_[0]};
494 return $obj;
55e2d745 495}
496
ec353f53 497=head2 add_to_$rel
498
499B<Currently only available for C<has_many>, C<many-to-many> and 'multi' type
500relationships.>
501
502=over 4
503
504=item Arguments: ($foreign_vals | $obj), $link_vals?
505
506=back
507
508 my $role = $schema->resultset('Role')->find(1);
509 $actor->add_to_roles($role);
510 # creates a My::DBIC::Schema::ActorRoles linking table row object
511
512 $actor->add_to_roles({ name => 'lead' }, { salary => 15_000_000 });
513 # creates a new My::DBIC::Schema::Role row object and the linking table
514 # object with an extra column in the link
515
516Adds a linking table object for C<$obj> or C<$foreign_vals>. If the first
517argument is a hash reference, the related object is created first with the
518column values in the hash. If an object reference is given, just the linking
519table object is created. In either case, any additional column values for the
520linking table object can be specified in C<$link_vals>.
521
522=head2 set_$rel
523
524B<Currently only available for C<many-to-many> relationships.>
525
526=over 4
527
ac36a402 528=item Arguments: (\@hashrefs | \@objs), $link_vals?
ec353f53 529
530=back
531
532 my $actor = $schema->resultset('Actor')->find(1);
533 my @roles = $schema->resultset('Role')->search({ role =>
debccec3 534 { '-in' => ['Fred', 'Barney'] } } );
ec353f53 535
4d3a827d 536 $actor->set_roles(\@roles);
537 # Replaces all of $actor's previous roles with the two named
ec353f53 538
ac36a402 539 $actor->set_roles(\@roles, { salary => 15_000_000 });
540 # Sets a column in the link table for all roles
541
542
4d3a827d 543Replace all the related objects with the given reference to a list of
544objects. This does a C<delete> B<on the link table resultset> to remove the
545association between the current object and all related objects, then calls
546C<add_to_$rel> repeatedly to link all the new objects.
bba68c67 547
548Note that this means that this method will B<not> delete any objects in the
549table on the right side of the relation, merely that it will delete the link
550between them.
ec353f53 551
4d3a827d 552Due to a mistake in the original implementation of this method, it will also
553accept a list of objects or hash references. This is B<deprecated> and will be
554removed in a future version.
555
ec353f53 556=head2 remove_from_$rel
557
558B<Currently only available for C<many-to-many> relationships.>
559
560=over 4
561
562=item Arguments: $obj
563
564=back
565
566 my $role = $schema->resultset('Role')->find(1);
567 $actor->remove_from_roles($role);
568 # removes $role's My::DBIC::Schema::ActorRoles linking table row object
569
570Removes the link between the current object and the related object. Note that
571the related object itself won't be deleted unless you call ->delete() on
572it. This method just removes the link between the two objects.
573
55e2d745 574=head1 AUTHORS
575
daec44b8 576Matt S. Trout <mst@shadowcatsystems.co.uk>
55e2d745 577
578=head1 LICENSE
579
580You may distribute this code under the same terms as Perl itself.
581
582=cut
583
4d87db01 5841;