=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();
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
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.
=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>.
=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'
);
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'
);
# 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.
=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>
=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>
=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
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">.
=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
=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>.
=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
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,
=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
=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>.
=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' },
);
=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
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
=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
1;
-=head1 AUTHORS
+=head1 AUTHOR AND CONTRIBUTORS
-see L<DBIx::Class>
+See L<AUTHOR|DBIx::Class/AUTHOR> and L<CONTRIBUTORS|DBIx::Class/CONTRIBUTORS> in DBIx::Class
=head1 LICENSE