I hate you all.
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship.pm
index 9e6d77d..6a5a046 100644 (file)
@@ -103,28 +103,69 @@ All helper methods take the following arguments:
   
 Both C<$cond> and C<$attrs> are optional. Pass C<undef> for C<$cond> if
 you want to use the default value for it, but still want to set C<$attrs>.
-See L<DBIx::Class::Relationship::Base> for a list of valid attributes.
+
+See L<DBIx::Class::Relationship::Base> for a list of valid attributes and valid
+relationship attributes.
 
 =head2 belongs_to
 
+=over 4
+
+=item Arguments: $accessor_name, $related_class, $foreign_key_column|$cond?, $attr?
+
+=back
+
   # in a Book class (where Author has many Books)
-  My::DBIC::Schema::Book->belongs_to(author => 'My::DBIC::Schema::Author');
-  my $author_obj = $obj->author;
-  $obj->author($new_author_obj);
+  My::DBIC::Schema::Book->belongs_to( author => 'My::DBIC::Schema::Author' );
+
+  my $author_obj = $obj->author; # get author object
+  $obj->author( $new_author_obj ); # set author object
+
+The above belongs_to relationship could also have been specified as,
+
+  My::DBIC::Schema::Book->belongs_to( author,
+                                      'My::DBIC::Schema::Author',
+                                      { 'self.author' => 'foreign.author' } );
 
 Creates a relationship where the calling class stores the foreign class's
-primary key in one (or more) of its columns. If $cond is a column name
-instead of a join condition hash, that is used as the name of the column
-holding the foreign key. If $cond is not given, the relname is used as
-the column name.
+primary key in one (or more) of its columns. This relationship defaults to
+using C<$accessor_name> as the foreign key in C<$related_class> to resolve the
+join, unless C<$foreign_key_column> specifies the foreign key column in
+C<$related_class> or C<$cond> specifies a reference to a join condition hash.
+
+If the relationship is optional -- i.e. the column containing the foreign key
+can be NULL -- then the belongs_to relationship does the right thing. Thus, in
+the example above C<$obj-E<gt>author> would return C<undef>.  However in this
+case you would probably want to set the C<join_type> attribute so that a C<LEFT
+JOIN> is done, which makes complex resultsets involving C<join> or C<prefetch>
+operations work correctly.  The modified declaration is shown below:
+
+  # in a Book class (where Author has_many Books)
+  __PACKAGE__->belongs_to(author => 'My::DBIC::Schema::Author',
+                          'author', {join_type => 'left'});
+
+
+Cascading deletes are off by default on a C<belongs_to>
+relationship. To turn them on, pass C<< cascade_delete => 1 >>
+in the $attr hashref.
 
 NOTE: If you are used to L<Class::DBI> relationships, this is the equivalent
 of C<has_a>.
 
+See L<DBIx::Class::Relationship::Base> for documentation on relationship
+methods and valid relationship attributes.
+
 =head2 has_many
 
-  # in an Author class (where Author has many Books)
+=over 4
+
+=item Arguments: $accessor_name, $related_class, $foreign_key_column|$cond?, $attr?
+
+=back
+
+  # in an Author class (where Author has_many Books)
   My::DBIC::Schema::Author->has_many(books => 'My::DBIC::Schema::Book', 'author');
+
   my $booklist = $obj->books;
   my $booklist = $obj->books({
     name => { LIKE => '%macaroni%' },
@@ -136,42 +177,91 @@ of C<has_a>.
 
   $obj->add_to_books(\%col_data);
 
+The above C<has_many> relationship could also have been specified with an
+explicit join condition:
+
+  My::DBIC::Schema::Author->has_many( books => 'My::DBIC::Schema::Book', {
+    'foreign.author' => 'self.author',
+  });
+
 Creates a one-to-many relationship, where the corresponding elements of the
 foreign class store the calling class's primary key in one (or more) of its
-columns. You should pass the name of the column in the foreign class as the
-$cond argument, or specify a complete join condition.
-
-Three methods are created when you create a has_many relationship.  The first 
-method is the expected accessor method.  The second is almost exactly the same 
-as the accessor method but "_rs" is added to the end of the method name.  This 
-method works just like the normal accessor, except that it returns a resultset 
-no matter what, even in list context. The third method, named 
-C<< add_to_<relname> >>, will also be added to your Row items, this allows 
-you to insert new related items, using the same mechanism as in 
+columns. This relationship defaults to using C<$accessor_name> as the foreign
+key in C<$related_class> to resolve the join, unless C<$foreign_key_column>
+specifies the foreign key column in C<$related_class> or C<$cond> specifies a
+reference to a join condition hash.
+
+Three methods are created when you create a has_many relationship.  The first
+method is the expected accessor method, C<$accessor_name()>.  The second is
+almost exactly the same as the accessor method but "_rs" is added to the end of
+the method name.  This method works just like the normal accessor, except that
+it returns a resultset no matter what, even in list context. The third method,
+named C<< add_to_$relname >>, will also be added to your Row items; this
+allows you to insert new related items, using the same mechanism as in
 L<DBIx::Class::Relationship::Base/"create_related">.
 
 If you delete an object in a class with a C<has_many> relationship, all
-related objects will be deleted as well. However, any database-level
-cascade or restrict will take precedence.
+the related objects will be deleted as well.  To turn this behaviour off,
+pass C<< cascade_delete => 0 >> in the C<$attr> hashref. However, any
+database-level cascade or restrict will take precedence over a
+DBIx-Class-based cascading delete.
+
+See L<DBIx::Class::Relationship::Base> for documentation on relationship
+methods and valid relationship attributes.
 
 =head2 might_have
 
-  My::DBIC::Schema::Author->might_have(pseudonym =>
-                                       'My::DBIC::Schema::Pseudonyms');
+=over 4
+
+=item Arguments: $accessor_name, $related_class, $foreign_key_column|$cond?, $attr?
+
+=back
+
+  My::DBIC::Schema::Author->might_have( pseudonym =>
+                                        'My::DBIC::Schema::Pseudonym' );
+
   my $pname = $obj->pseudonym; # to get the Pseudonym object
 
-Creates an optional one-to-one relationship with a class, where the foreign
-class stores our primary key in one of its columns. Defaults to the primary
-key of the foreign class unless $cond specifies a column or join condition.
+The above might_have relationship could have been specified as:
+
+  My::DBIC::Schema::Author->might_have( pseudonym =>
+                                        'My::DBIC::Schema::Pseudonym',
+                                        'author' );
+
+Or even:
+
+  My::DBIC::Schema::Author->might_have( pseudonym =>
+                                        'My::DBIC::Schema::Pseudonym',
+                                        { 'foreign.author' => 'self.author' } );
+
+Assuming the Pseudonym table has
+
+Creates an optional one-to-one relationship with a class. This relationship
+defaults to using C<$accessor_name> as the foreign key in C<$related_class> to
+resolve the join, unless C<$foreign_key_column> specifies the foreign key
+column in C<$related_class> or C<$cond> specifies a reference to a join
+condition hash.
 
 If you update or delete an object in a class with a C<might_have>
-relationship, the related object will be updated or deleted as well.
-Any database-level update or delete constraints will override this behaviour.
+relationship, the related object will be updated or deleted as well. To
+turn off this behavior, add C<< cascade_delete => 0 >> to the C<$attr>
+hashref. Any database-level update or delete constraints will override
+this behavior.
+
+See L<DBIx::Class::Relationship::Base> for documentation on relationship
+methods and valid relationship attributes.
 
 =head2 has_one
 
+=over 4
+
+=item Arguments: $accessor_name, $related_class_name, $join_condition?, $attr?
+
+=back
+
   My::DBIC::Schema::Book->has_one(isbn => 'My::DBIC::Schema::ISBN');
-  my $isbn_obj = $obj->isbn;
+
+  my $isbn_obj = $obj->isbn; # to get the ISBN object
 
 Creates a one-to-one relationship with another class. This is just like
 C<might_have>, except the implication is that the other object is always
@@ -179,9 +269,26 @@ present. The only difference between C<has_one> and C<might_have> is that
 C<has_one> uses an (ordinary) inner join, whereas C<might_have> uses a
 left join.
 
+The has_one relationship should be used when a row in the table has exactly one
+related row in another table. If the related row might not exist in the foreign
+table, use the L<DBIx::Class::Relationship/might_have> relationship.
+
+In the above example, each Book in the database is associated with exactly one
+ISBN object.
+
+See L<DBIx::Class::Relationship::Base> for documentation on relationship
+methods and valid relationship attributes.
 
 =head2 many_to_many
 
+=over 4
+
+=item Arguments: $accessor_name, $link_rel_name, $foreign_rel_name, $attr?
+
+=back
+
+To create a many_to_many relationship from Actor to Role:
+
   My::DBIC::Schema::Actor->has_many( actor_roles =>
                                      'My::DBIC::Schema::ActorRoles',
                                      'actor' );
@@ -193,17 +300,36 @@ left join.
   My::DBIC::Schema::Actor->many_to_many( roles => 'actor_roles',
                                          'role' );
 
-  ...
+And, for the reverse relationship, from Role to Actor:
 
-  my @role_objs = $actor->roles;
+  My::DBIC::Schema::Role->has_many( actor_roles =>
+                                    'My::DBIC::Schema::ActorRoles',
+                                    'role' );
+
+  My::DBIC::Schema::Role->many_to_many( actors => 'actor_roles', 'actor' );
+
+Creates accessors bridging two relationships; not strictly a relationship in
+its own right, although the accessor will return a resultset or collection of
+objects just as a has_many would.
+
+In the above example, ActorRoles is the link table class, and Role is the
+foreign class. The C<$link_rel_name> parameter is the name of the accessor for
+the has_many relationship from this table to the link table, and the
+C<$foreign_rel_name> parameter is the accessor for the belongs_to relationship
+from the link table to the foreign table.
 
-Creates an accessor bridging two relationships; not strictly a relationship
-in its own right, although the accessor will return a resultset or collection
-of objects just as a has_many would.
 To use many_to_many, existing relationships from the original table to the link
 table, and from the link table to the end table must already exist, these
 relation names are then used in the many_to_many call.
 
+In the above example, the Actor class will have 3 many_to_many accessor methods
+set: C<$roles>, C<$add_to_roles>, C<$set_roles>, and similarly named accessors
+will be created for the Role class for the C<actors> many_to_many
+relationship.
+
+See L<DBIx::Class::Relationship::Base> for documentation on relationship
+methods and valid relationship attributes.
+
 =cut
 
 1;