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