Protect several resolve_relationship_condition() callsites
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship.pm
index ff26676..195514c 100644 (file)
@@ -13,6 +13,10 @@ __PACKAGE__->load_own_components(qw/
   Base
 /);
 
+1;
+
+__END__
+
 =head1 NAME
 
 DBIx::Class::Relationship - Inter-table relationships
@@ -20,15 +24,15 @@ DBIx::Class::Relationship - Inter-table relationships
 =head1 SYNOPSIS
 
   ## Creating relationships
-  MyDB::Schema::Actor->has_many('actorroles' => 'MyDB::Schema::ActorRole',
+  MyApp::Schema::Actor->has_many('actorroles' => 'MyApp::Schema::ActorRole',
                                 'actor');
-  MyDB::Schema::Role->has_many('actorroles' => 'MyDB::Schema::ActorRole',
+  MyApp::Schema::Role->has_many('actorroles' => 'MyApp::Schema::ActorRole',
                                 'role');
-  MyDB::Schema::ActorRole->belongs_to('role' => 'MyDB::Schema::Role');
-  MyDB::Schema::ActorRole->belongs_to('actor' => 'MyDB::Schema::Actor');
+  MyApp::Schema::ActorRole->belongs_to('role' => 'MyApp::Schema::Role');
+  MyApp::Schema::ActorRole->belongs_to('actor' => 'MyApp::Schema::Actor');
 
-  MyDB::Schema::Role->many_to_many('actors' => 'actorroles', 'actor');
-  MyDB::Schema::Actor->many_to_many('roles' => 'actorroles', 'role');
+  MyApp::Schema::Role->many_to_many('actors' => 'actorroles', 'actor');
+  MyApp::Schema::Actor->many_to_many('roles' => 'actorroles', 'role');
 
   ## Using relationships
   $schema->resultset('Actor')->find({ id => 1})->roles();
@@ -72,10 +76,10 @@ we can do this instead:
  my $fredsbooks = $schema->resultset('Author')->find({ Name => 'Fred' })->books;
 
 Each relationship sets up an accessor method on the
-L<DBIx::Class::Manual::Glossary/"Row"> objects that represent the items
-of your table. From L<DBIx::Class::Manual::Glossary/"ResultSet"> objects,
+L<Result|DBIx::Class::Manual::Glossary/"Result"> objects that represent the items
+of your table. From L<ResultSet|DBIx::Class::Manual::Glossary/"ResultSet"> objects,
 the relationships can be searched using the "search_related" method.
-In list context, each returns a list of Row objects for the related class,
+In list context, each returns a list of Result objects for the related class,
 in scalar context, a new ResultSet representing the joined tables is
 returned. Thus, the calls can be chained to produce complex queries.
 Since the database is not actually queried until you attempt to retrieve
@@ -105,13 +109,13 @@ L<DBIx::Class::Relationship::Base>.
 
 All helper methods are called similar to the following template:
 
-  __PACKAGE__->$method_name('relname', 'Foreign::Class', 
-                            \%cond | \@cond | \&conf, \%attrs);
+  __PACKAGE__->$method_name('rel_name', 'Foreign::Class', \%cond|\@cond|\&cond?, \%attrs?);
 
 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/condition> for full documentation on definition of the C<cond> argument.
+See L<DBIx::Class::Relationship::Base/condition> for full documentation on
+definition of the C<cond> argument.
 
 See L<DBIx::Class::Relationship::Base/attributes> for documentation on the
 attributes that are allowed in the C<attrs> argument.
@@ -137,7 +141,7 @@ in this class or C<cond> specifies a reference to a join condition.
 =item accessor_name
 
 This argument is the name of the method you can call on a
-L<DBIx::Class::Row> object to retrieve the instance of the foreign
+L<Result|DBIx::Class::Manual::ResultClass> object to retrieve the instance of the foreign
 class matching this relationship. This is often called the
 C<relation(ship) name>.
 
@@ -159,14 +163,14 @@ OR
 =item cond
 
 A hashref, arrayref or coderef specifying a custom join expression. For
-documentation see L<DBIx::Class::Relationship/condition>.
+more info see L<DBIx::Class::Relationship::Base/condition>.
 
 =back
 
   # in a Book class (where Author has many Books)
-  My::DBIC::Schema::Book->belongs_to( 
-    author => 
-    'My::DBIC::Schema::Author', 
+  My::DBIC::Schema::Book->belongs_to(
+    author =>
+    'My::DBIC::Schema::Author',
     'author_id'
   );
 
@@ -174,11 +178,11 @@ documentation see L<DBIx::Class::Relationship/condition>.
   My::DBIC::Schema::Book->belongs_to(
     author =>
     'My::DBIC::Schema::Author',
-    { 'foreign.author_id' => 'self.author_id' } 
+    { 'foreign.author_id' => 'self.author_id' }
   );
 
   # OR (similar result but uglier accessor name)
-  My::DBIC::Schema::Book->belongs_to( 
+  My::DBIC::Schema::Book->belongs_to(
     author_id =>
     'My::DBIC::Schema::Author'
   );
@@ -191,25 +195,25 @@ documentation see L<DBIx::Class::Relationship/condition>.
   # To retrieve the plain id if you used the ugly version:
   $book->get_column('author_id');
 
-
-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->author >> would
-return C<undef>.  However in this case you would probably want to set
-the L<join_type|DBIx::Class::Relationship/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:
+If some of the foreign key columns are
+L<nullable|DBIx::Class::ResultSource/is_nullable> you probably want to set
+the L<join_type|DBIx::Class::Relationship::Base/join_type> attribute to
+C<left> explicitly so that SQL expressing this relation is composed with
+a C<LEFT JOIN> (as opposed to C<INNER JOIN> which is default for
+L</belongs_to> relationships). This ensures that relationship traversal
+works consistently in all situations. (i.e. resultsets involving
+L<join|DBIx::Class::ResultSet/join> or
+L<prefetch|DBIx::Class::ResultSet/prefetch>).
+The modified declaration is shown below:
 
   # in a Book class (where Author has_many Books)
   __PACKAGE__->belongs_to(
-    author => 
+    author =>
     'My::DBIC::Schema::Author',
-    '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.
@@ -231,13 +235,13 @@ which can be assigned to relationships as well.
 
 =over 4
 
-=item Arguments: $accessor_name, $related_class, $their_fk_column|\%cond|\@cond\&cond?, \%attrs?
+=item Arguments: $accessor_name, $related_class, $their_fk_column|\%cond|\@cond|\&cond?, L<\%attrs?|DBIx::Class::ResultSet/ATTRIBUTES>
 
 =back
 
 Creates a one-to-many relationship where the foreign class refers to
 this class's primary key. This relationship refers to zero or more
-records in the foreign table (e.g. a C<LEFT JOIN>). This relationship 
+records in the foreign table (e.g. a C<LEFT JOIN>). This relationship
 defaults to using the end of this classes namespace as the foreign key
 in C<$related_class> to resolve the join, unless C<$their_fk_column>
 specifies the foreign key column in C<$related_class> or C<cond>
@@ -248,9 +252,9 @@ specifies a reference to a join condition.
 =item accessor_name
 
 This argument is the name of the method you can call on a
-L<DBIx::Class::Row> object to retrieve a resultset of the related
-class restricted to the ones related to the row object. In list
-context it returns the row objects. This is often called the
+L<Result|DBIx::Class::Manual::ResultClass> object to retrieve a resultset of the related
+class restricted to the ones related to the result object. In list
+context it returns the result objects. This is often called the
 C<relation(ship) name>.
 
 Use this accessor_name in L<DBIx::Class::ResultSet/join>
@@ -271,35 +275,35 @@ OR
 =item cond
 
 A hashref, arrayref  or coderef specifying a custom join expression. For
-documentation see L<DBIx::Class::Relationship/condition>.
+more info see L<DBIx::Class::Relationship::Base/condition>.
 
 =back
 
   # in an Author class (where Author has_many Books)
   # assuming related class is storing our PK in "author_id"
   My::DBIC::Schema::Author->has_many(
-    books => 
-    'My::DBIC::Schema::Book', 
+    books =>
+    'My::DBIC::Schema::Book',
     'author_id'
   );
 
   # OR (same result)
   My::DBIC::Schema::Author->has_many(
-    books => 
-    'My::DBIC::Schema::Book', 
+    books =>
+    'My::DBIC::Schema::Book',
     { 'foreign.author_id' => 'self.id' },
   );
 
   # OR (similar result, assuming related_class is storing our PK, in "author")
   # (the "author" is guessed at from "Author" in the class namespace)
   My::DBIC::Schema::Author->has_many(
-    books => 
-    'My::DBIC::Schema::Book', 
+    books =>
+    'My::DBIC::Schema::Book',
   );
 
 
   # Usage
-  # resultset of Books belonging to author 
+  # resultset of Books belonging to author
   my $booklist = $author->books;
 
   # resultset of Books belonging to author, restricted by author name
@@ -327,7 +331,7 @@ The second is almost exactly the same as the accessor method but "_rs"
 is added to the end of the method name, eg C<$accessor_name_rs()>.
 This method works just like the normal accessor, except that it always
 returns a resultset, even in list context. The third method, named C<<
-add_to_$relname >>, will also be added to your Row items; this allows
+add_to_$rel_name >>, 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">.
 
@@ -355,7 +359,7 @@ relationships as well.
 
 =over 4
 
-=item Arguments: $accessor_name, $related_class, $their_fk_column|\%cond|\@cond|\&cond?, \%attrs?
+=item Arguments: $accessor_name, $related_class, $their_fk_column|\%cond|\@cond|\&cond?, L<\%attrs?|DBIx::Class::ResultSet/ATTRIBUTES>
 
 =back
 
@@ -370,7 +374,7 @@ condition.
 =item accessor_name
 
 This argument is the name of the method you can call on a
-L<DBIx::Class::Row> object to retrieve the instance of the foreign
+L<Result|DBIx::Class::Manual::ResultClass> object to retrieve the instance of the foreign
 class matching this relationship. This is often called the
 C<relation(ship) name>.
 
@@ -392,7 +396,7 @@ OR
 =item cond
 
 A hashref, arrayref  or coderef specifying a custom join expression. For
-documentation see L<DBIx::Class::Relationship/condition>.
+more info see L<DBIx::Class::Relationship::Base/condition>.
 
 =back
 
@@ -440,7 +444,7 @@ current table allows nulls (i.e., has the C<is_nullable> attribute set to a
 true value), than C<might_have> will warn about this because it's naughty and
 you shouldn't do that. The warning will look something like:
 
-   "might_have/has_one" must not be on columns with is_nullable set to true (MySchema::SomeClass/key)
+  "might_have/has_one" must not be on columns with is_nullable set to true (MySchema::SomeClass/key)
 
 If you must be naughty, you can suppress the warning by setting
 C<DBIC_DONT_VALIDATE_RELS> environment variable to a true value.  Otherwise,
@@ -450,7 +454,7 @@ you probably just meant to use C<DBIx::Class::Relationship/belongs_to>.
 
 =over 4
 
-=item Arguments: $accessor_name, $related_class, $their_fk_column|\%cond|\@cond|\&cond?, \%attrs?
+=item Arguments: $accessor_name, $related_class, $their_fk_column|\%cond|\@cond|\&cond?, L<\%attrs?|DBIx::Class::ResultSet/ATTRIBUTES>
 
 =back
 
@@ -465,7 +469,7 @@ condition.
 =item accessor_name
 
 This argument is the name of the method you can call on a
-L<DBIx::Class::Row> object to retrieve the instance of the foreign
+L<Result|DBIx::Class::Manual::ResultClass> object to retrieve the instance of the foreign
 class matching this relationship. This is often called the
 C<relation(ship) name>.
 
@@ -487,26 +491,26 @@ OR
 =item cond
 
 A hashref, arrayref  or coderef specifying a custom join expression. For
-documentation see L<DBIx::Class::Relationship/condition>.
+more info see L<DBIx::Class::Relationship::Base/condition>.
 
 =back
 
   # Every book has exactly one ISBN
   My::DBIC::Schema::Book->has_one(
-    isbn => 
+    isbn =>
     'My::DBIC::Schema::ISBN',
     'book_id',
   );
 
   # OR (same result, assuming related_class stores our PK)
   My::DBIC::Schema::Book->has_one(
-    isbn => 
+    isbn =>
     'My::DBIC::Schema::ISBN',
   );
 
   # OR (same result)
   My::DBIC::Schema::Book->has_one(
-    isbn => 
+    isbn =>
     'My::DBIC::Schema::ISBN',
     { 'foreign.book_id' => 'self.id' },
   );
@@ -543,7 +547,7 @@ L<DBIx::Class::Relationship/might_have>.
 
 =over 4
 
-=item Arguments: $accessor_name, $link_rel_name, $foreign_rel_name, \%attrs?
+=item Arguments: $accessor_name, $link_rel_name, $foreign_rel_name, L<\%attrs?|DBIx::Class::ResultSet/ATTRIBUTES>
 
 =back
 
@@ -553,8 +557,8 @@ L<Glossary|DBIx::Class::Manual::Glossary/Relationship bridge>.
 
 C<many_to_many> is not strictly a relationship in its own right. Instead, it is
 a bridge between two resultsets which provide the same kind of convenience
-accessors as true relationships provide. Although the accessor will return a 
-resultset or collection of objects just like has_many does, you cannot call 
+accessors as true relationships provide. Although the accessor will return a
+resultset or collection of objects just like has_many does, you cannot call
 C<related_resultset> and similar methods which operate on true relationships.
 
 =over
@@ -562,7 +566,7 @@ C<related_resultset> and similar methods which operate on true relationships.
 =item accessor_name
 
 This argument is the name of the method you can call on a
-L<DBIx::Class::Row> object to retrieve the rows matching this
+L<Result|DBIx::Class::Manual::ResultClass> object to retrieve the rows matching this
 relationship.
 
 On a many_to_many, unlike other relationships, this cannot be used in
@@ -629,17 +633,13 @@ L<DBIx::Class::ResultSet> for a L<list of standard resultset
 attributes|DBIx::Class::ResultSet/ATTRIBUTES> which can be assigned to
 relationships as well.
 
-=cut
-
-1;
-
-=head1 AUTHORS
-
-see L<DBIx::Class>
-
-=head1 LICENSE
+=head1 FURTHER QUESTIONS?
 
-You may distribute this code under the same terms as Perl itself.
+Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
 
-=cut
+=head1 COPYRIGHT AND LICENSE
 
+This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
+by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
+redistribute it and/or modify it under the same terms as the
+L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.