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