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