Skip to content

Commit

Permalink
Merge branch 'people/riba/extrels' into 0.08200_track_do_not_rebase
Browse files Browse the repository at this point in the history
  • Loading branch information
ribasushi committed Jan 20, 2011
2 parents f459184 + 78b948c commit cacb39b
Show file tree
Hide file tree
Showing 16 changed files with 934 additions and 200 deletions.
144 changes: 70 additions & 74 deletions lib/DBIx/Class/Relationship.pm
Original file line number Diff line number Diff line change
Expand Up @@ -105,20 +105,23 @@ L<DBIx::Class::Relationship::Base>.
All helper methods are called similar to the following template:
__PACKAGE__->$method_name('relname', 'Foreign::Class', \%cond | \@cond, \%attrs);
__PACKAGE__->$method_name('relname', '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>.
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 documentation on the
attributes that are allowed in the C<\%attrs> 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.
=head2 belongs_to
=over 4
=item Arguments: $accessor_name, $related_class, $our_fk_column|\%cond|\@cond?, \%attrs?
=item Arguments: $accessor_name, $related_class, $our_fk_column|\%cond|\@cond|\$cond?, \%attrs?
=back
Expand All @@ -127,7 +130,7 @@ class's primary key in one (or more) of the calling class columns.
This relationship defaults to using C<$accessor_name> as the column
name in this class to resolve the join against the primary key from
C<$related_class>, unless C<$our_fk_column> specifies the foreign key column
in this class or C<cond> specifies a reference to a join condition hash.
in this class or C<cond> specifies a reference to a join condition.
=over
Expand Down Expand Up @@ -155,13 +158,11 @@ OR
=item cond
A hashref where the keys are C<foreign.$column_on_related_table> and
the values are C<self.$our_fk_column>. This is useful for
relations that are across multiple columns.
A hashref, arrayref or coderef specifying a custom join expression. For
more info see L<DBIx::Class::Relationship/condition>.
=back
# in a Book class (where Author has many Books)
My::DBIC::Schema::Book->belongs_to(
author =>
Expand Down Expand Up @@ -191,12 +192,14 @@ relations that are across multiple columns.
$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-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:
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:
# in a Book class (where Author has_many Books)
__PACKAGE__->belongs_to(
Expand All @@ -213,13 +216,13 @@ in the $attr hashref.
By default, DBIC will return undef and avoid querying the database if a
C<belongs_to> accessor is called when any part of the foreign key IS NULL. To
disable this behavior, pass C<< undef_on_null_fk => 0 >> in the C<$attr>
disable this behavior, pass C<< undef_on_null_fk => 0 >> in the C<\%attrs>
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
See L<DBIx::Class::Relationship::Base/attributes> for documentation on relationship
methods and valid relationship attributes. Also see L<DBIx::Class::ResultSet>
for a L<list of standard resultset attributes|DBIx::Class::ResultSet/ATTRIBUTES>
which can be assigned to relationships as well.
Expand All @@ -228,7 +231,7 @@ which can be assigned to relationships as well.
=over 4
=item Arguments: $accessor_name, $related_class, $their_fk_column|\%cond|\@cond?, \%attrs?
=item Arguments: $accessor_name, $related_class, $their_fk_column|\%cond|\@cond|\&cond?, \%attrs?
=back
Expand All @@ -238,7 +241,7 @@ 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>
specifies a reference to a join condition hash.
specifies a reference to a join condition.
=over
Expand Down Expand Up @@ -267,19 +270,8 @@ OR
=item cond
A hashref where the keys are C<foreign.$their_fk_column> and
the values are C<self.$matching_column>. This is useful for
relations that are across multiple columns.
OR
An arrayref containing an SQL::Abstract-like condition. For example a
link table where two columns link back to the same table. This is an
OR condition.
My::Schema::Item->has_many('rels', 'My::Schema::Relationships',
[ { 'foreign.LItemID' => 'self.ID' },
{ 'foreign.RItemID' => 'self.ID'} ]);
A hashref, arrayref or coderef specifying a custom join expression. For
more info see L<DBIx::Class::Relationship/condition>.
=back
Expand Down Expand Up @@ -329,13 +321,14 @@ OR condition.
$author->add_to_books(\%col_data);
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 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 you to insert new related items, using the same mechanism as in
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, 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
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
Expand All @@ -352,24 +345,25 @@ the related objects will be copied as well. To turn this behaviour off,
pass C<< cascade_copy => 0 >> in the C<$attr> hashref. The behaviour
defaults to C<< cascade_copy => 1 >>.
See L<DBIx::Class::Relationship::Base> for documentation on relationship
methods and valid relationship attributes. Also see L<DBIx::Class::ResultSet>
for a L<list of standard resultset attributes|DBIx::Class::ResultSet/ATTRIBUTES>
which can be assigned to relationships as well.
See L<DBIx::Class::Relationship::Base/attributes> for documentation on
relationship methods and valid relationship attributes. Also see
L<DBIx::Class::ResultSet> for a L<list of standard resultset
attributes|DBIx::Class::ResultSet/ATTRIBUTES> which can be assigned to
relationships as well.
=head2 might_have
=over 4
=item Arguments: $accessor_name, $related_class, $their_fk_column|\%cond|\@cond?, \%attrs?
=item Arguments: $accessor_name, $related_class, $their_fk_column|\%cond|\@cond|\&cond?, \%attrs?
=back
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<$their_fk_column> specifies the foreign key
column in C<$related_class> or C<cond> specifies a reference to a join
condition hash.
condition.
=over
Expand Down Expand Up @@ -397,9 +391,8 @@ OR
=item cond
A hashref where the keys are C<foreign.$their_fk_column> and
the values are C<self.$matching_column>. This is useful for
relations that are across multiple columns.
A hashref, arrayref or coderef specifying a custom join expression. For
more info see L<DBIx::Class::Relationship/condition>.
=back
Expand Down Expand Up @@ -436,35 +429,36 @@ update, so if your database has a constraint on the relationship, it
will have deleted/updated the related records or raised an exception
before DBIx::Class gets to perform the cascaded operation.
See L<DBIx::Class::Relationship::Base> for documentation on relationship
methods and valid relationship attributes. Also see L<DBIx::Class::ResultSet>
for a L<list of standard resultset attributes|DBIx::Class::ResultSet/ATTRIBUTES>
which can be assigned to relationships as well.
See L<DBIx::Class::Relationship::Base/attributes> for documentation on
relationship methods and valid relationship attributes. Also see
L<DBIx::Class::ResultSet> for a L<list of standard resultset
attributes|DBIx::Class::ResultSet/ATTRIBUTES> which can be assigned to
relationships as well.
Note that if you supply a condition on which to join, if the column in the
Note that if you supply a condition on which to join, and the column in the
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.
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,
you probably just want to use C<DBIx::Class::Relationship/belongs_to>.
you probably just meant to use C<DBIx::Class::Relationship/belongs_to>.
=head2 has_one
=over 4
=item Arguments: $accessor_name, $related_class, $their_fk_column|\%cond|\@cond?, \%attrs?
=item Arguments: $accessor_name, $related_class, $their_fk_column|\%cond|\@cond|\&cond?, \%attrs?
=back
Creates a 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<$their_fk_column> specifies the foreign key
column in C<$related_class> or C<cond> specifies a reference to a join
condition hash.
condition.
=over
Expand Down Expand Up @@ -492,9 +486,8 @@ OR
=item cond
A hashref where the keys are C<foreign.$their_fk_column> and
the values are C<self.$matching_column>. This is useful for
relations that are across multiple columns.
A hashref, arrayref or coderef specifying a custom join expression. For
more info see L<DBIx::Class::Relationship/condition>.
=back
Expand Down Expand Up @@ -527,17 +520,19 @@ always 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> defaults to 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.
The has_one relationship should be used when a row in the table must
have 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. Also see L<DBIx::Class::ResultSet>
for a L<list of standard resultset attributes|DBIx::Class::ResultSet/ATTRIBUTES>
which can be assigned to relationships as well.
See L<DBIx::Class::Relationship::Base/attributes> for documentation on
relationship methods and valid relationship attributes. Also see
L<DBIx::Class::ResultSet> for a L<list of standard resultset
attributes|DBIx::Class::ResultSet/ATTRIBUTES> which can be assigned to
relationships as well.
Note that if you supply a condition on which to join, if the column in the
current table allows nulls (i.e., has the C<is_nullable> attribute set to a
Expand Down Expand Up @@ -628,10 +623,11 @@ 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. Also see L<DBIx::Class::ResultSet>
for a L<list of standard resultset attributes|DBIx::Class::ResultSet/ATTRIBUTES>
which can be assigned to relationships as well.
See L<DBIx::Class::Relationship::Base/attributes> for documentation on
relationship methods and valid relationship attributes. Also see
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

Expand Down
2 changes: 1 addition & 1 deletion lib/DBIx/Class/Relationship/Accessor.pm
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ sub add_relationship_accessor {
return $self->{_relationship_data}{$rel};
} else {
my $cond = $self->result_source->_resolve_condition(
$rel_info->{cond}, $rel, $self
$rel_info->{cond}, $rel, $self, $rel
);
if ($rel_info->{attrs}->{undef_on_null_fk}){
return undef unless ref($cond) eq 'HASH';
Expand Down
Loading

0 comments on commit cacb39b

Please sign in to comment.