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