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