X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRelationship%2FBase.pm;h=05f4c52ba0e9a50b6b8808530eb3935c0912ea31;hb=9c2c91ea7f94d7981cd1c8d212a4b04751fcd023;hp=9ea8cff1062c421caeea30325709b634d461cadc;hpb=27f01d1f4fc106e0d27a13c6f6c9d5fa131e9447;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Relationship/Base.pm b/lib/DBIx/Class/Relationship/Base.pm index 9ea8cff..05f4c52 100644 --- a/lib/DBIx/Class/Relationship/Base.pm +++ b/lib/DBIx/Class/Relationship/Base.pm @@ -5,7 +5,7 @@ use warnings; use base qw/DBIx::Class/; -=head1 NAME +=head1 NAME DBIx::Class::Relationship::Base - Inter-table relationships @@ -15,7 +15,7 @@ DBIx::Class::Relationship::Base - Inter-table relationships This class provides methods to describe the relationships between the tables in your database model. These are the "bare bones" relationships -methods, for predefined ones, look in L. +methods, for predefined ones, look in L. =head1 METHODS @@ -23,33 +23,48 @@ methods, for predefined ones, look in L. =over 4 -=item Arguments: ('relname', 'Foreign::Class', $cond, $attrs) +=item Arguments: 'relname', 'Foreign::Class', $cond, $attrs =back __PACKAGE__->add_relationship('relname', 'Foreign::Class', $cond, $attrs); -The condition needs to be an SQL::Abstract-style representation of the -join between the tables. When resolving the condition for use in a JOIN, -keys using the psuedo-table I are resolved to mean "the Table on the -other side of the relationship", and values using the psuedo-table I +The condition needs to be an L-style representation of the +join between the tables. When resolving the condition for use in a C, +keys using the pseudo-table C are resolved to mean "the Table on the +other side of the relationship", and values using the pseudo-table C are resolved to mean "the Table this class is representing". Other restrictions, such as by value, sub-select and other tables, may also be -used. Please check your database for JOIN parameter support. +used. Please check your database for C parameter support. -For example, if you're creating a rel from Author to Book, where the Book -table has a column author_id containing the ID of the Author row: +For example, if you're creating a relationship from C to C, where +the C table has a column C containing the ID of the C +row: { 'foreign.author_id' => 'self.id' } -will result in the JOIN clause +will result in the C clause - author me JOIN book book ON bar.author_id = me.id + author me JOIN book book ON book.author_id = me.id -You can specify as many foreign => self mappings as necessary. Each key/value -pair provided in a hashref will be used as ANDed conditions, to add an ORed -condition, use an arrayref of hashrefs. See the L documentation -for more details. +For multi-column foreign keys, you will need to specify a C-to-C +mapping for each column in the key. For example, if you're creating a +relationship from C to C, where the C table refers to a +publisher and a type (e.g. "paperback"): + + { + 'foreign.publisher_id' => 'self.publisher_id', + 'foreign.type_id' => 'self.type_id', + } + +This will result in the C clause: + + book me JOIN edition edition ON edition.publisher_id = me.publisher_id + AND edition.type_id = me.type_id + +Each key-value pair provided in a hashref will be used as Ced conditions. +To add an Ced condition, use an arrayref of hashrefs. See the +L documentation for more details. Valid attributes are as follows: @@ -92,12 +107,12 @@ created, which calls C for the relationship. =over 4 -=item Arguments: ($relname, $rel_info) +=item Arguments: $relname, $rel_info =back Registers a relationship on the class. This is called internally by -L to set up Accessors and Proxies. +DBIx::Class::ResultSourceProxy to set up Accessors and Proxies. =cut @@ -107,9 +122,9 @@ sub register_relationship { } =over 4 -=item Arguments: ($relationship_name) +=item Arguments: $relationship_name -=item Returns: $related_resultset +=item Return Value: $related_resultset =back @@ -249,7 +264,8 @@ L for details. sub find_or_create_related { my $self = shift; - return $self->find_related(@_) || $self->create_related(@_); + my $obj = $self->find_related(@_); + return (defined($obj) ? $obj : $self->create_related(@_)); } =head2 set_from_related @@ -276,9 +292,11 @@ sub set_from_related { "condition for $rel is of type ". (ref $cond ? ref $cond : 'plain scalar') ) unless ref $cond eq 'HASH'; - my $f_class = $self->result_source->schema->class($rel_obj->{class}); - $self->throw_exception( "Object $f_obj isn't a ".$f_class ) - unless $f_obj->isa($f_class); + if (defined $f_obj) { + my $f_class = $self->result_source->schema->class($rel_obj->{class}); + $self->throw_exception( "Object $f_obj isn't a ".$f_class ) + unless $f_obj->isa($f_class); + } $self->set_columns( $self->result_source->resolve_condition( $rel_obj->{cond}, $f_obj, $rel));