X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRelationship%2FBase.pm;h=9e4a35a1a502488d2a555c39f26f9f90da1c9150;hb=e76db9c6078ffe90873ea9641774d448b555fa7e;hp=e64a0e476d3eb1298600fc2826c46733220fc7af;hpb=13de943d1aef0b4c2ff28505fc61c90b463302fb;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Relationship/Base.pm b/lib/DBIx/Class/Relationship/Base.pm index e64a0e4..9e4a35a 100644 --- a/lib/DBIx/Class/Relationship/Base.pm +++ b/lib/DBIx/Class/Relationship/Base.pm @@ -67,7 +67,9 @@ 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. -In addition to standard result set attributes, the following attributes are also valid: +In addition to the +L, +the following attributes are also valid: =over 4 @@ -109,6 +111,19 @@ is creating constraints where it shouldn't, or not creating them where it should, set this attribute to a true or false value to override the detection of when to create constraints. +=item on_delete / on_update + +If you are using L to create SQL for you, you can use these +attributes to explicitly set the desired C or C constraint +type. If not supplied the SQLT parser will attempt to infer the constraint type by +interrogating the attributes of the B relationship. For any 'multi' +relationship with C<< cascade_delete => 1 >>, the corresponding belongs_to +relationship will be created with an C constraint. For any +relationship bearing C<< cascade_copy => 1 >> the resulting belongs_to constraint +will be C. If you wish to disable this autodetection, and just +use the RDBMS' default constraint type, pass C<< on_delete => undef >> or +C<< on_delete => '' >>, and the same for C respectively. + =item is_deferrable Tells L that the foreign key constraint it creates should be @@ -116,6 +131,12 @@ deferrable. In other words, the user may request that the constraint be ignored until the end of the transaction. Currently, only the PostgreSQL producer actually supports this. +=item add_fk_index + +Tells L to add an index for this constraint. Can also be +specified globally in the args to L or +L. Default is on, set to 0 to disable. + =back =head2 register_relationship @@ -167,16 +188,36 @@ sub related_resultset { if (@_ > 1 && (@_ % 2 == 1)); my $query = ((@_ > 1) ? {@_} : shift); - my $cond = $self->result_source->resolve_condition( + my $source = $self->result_source; + my $cond = $source->resolve_condition( $rel_obj->{cond}, $rel, $self ); + if ($cond eq $DBIx::Class::ResultSource::UNRESOLVABLE_CONDITION) { + my $reverse = $source->reverse_relationship_info($rel); + foreach my $rev_rel (keys %$reverse) { + if ($reverse->{$rev_rel}{attrs}{accessor} eq 'multi') { + $attrs->{related_objects}{$rev_rel} = [ $self ]; + Scalar::Util::weaken($attrs->{related_object}{$rev_rel}[0]); + } else { + $attrs->{related_objects}{$rev_rel} = $self; + Scalar::Util::weaken($attrs->{related_object}{$rev_rel}); + } + } + } if (ref $cond eq 'ARRAY') { - $cond = [ map { my $hash; - foreach my $key (keys %$_) { - my $newkey = $key =~ /\./ ? "me.$key" : $key; - $hash->{$newkey} = $_->{$key}; - }; $hash } @$cond ]; - } else { + $cond = [ map { + if (ref $_ eq 'HASH') { + my $hash; + foreach my $key (keys %$_) { + my $newkey = $key =~ /\./ ? "me.$key" : $key; + $hash->{$newkey} = $_->{$key}; + } + $hash; + } else { + $_; + } + } @$cond ]; + } elsif (ref $cond eq 'HASH') { foreach my $key (grep { ! /\./ } keys %$cond) { $cond->{"me.$key"} = delete $cond->{$key}; } @@ -208,7 +249,7 @@ sub search_related { ( $objects_rs ) = $rs->search_related_rs('relname', $cond, $attrs); This method works exactly the same as search_related, except that -it garauntees a restultset, even in list context. +it guarantees a restultset, even in list context. =cut @@ -295,7 +336,8 @@ L on it. sub find_or_new_related { my $self = shift; - return $self->find_related(@_) || $self->new_related(@_); + my $obj = $self->find_related(@_); + return defined $obj ? $obj : $self->new_related(@_); } =head2 find_or_create_related @@ -357,7 +399,7 @@ sub set_from_related { (ref $cond ? ref $cond : 'plain scalar') ) unless ref $cond eq 'HASH'; if (defined $f_obj) { - my $f_class = $self->result_source->schema->class($rel_obj->{class}); + my $f_class = $rel_obj->{class}; $self->throw_exception( "Object $f_obj isn't a ".$f_class ) unless Scalar::Util::blessed($f_obj) and $f_obj->isa($f_class); } @@ -434,7 +476,7 @@ B relationships.> my $actor = $schema->resultset('Actor')->find(1); my @roles = $schema->resultset('Role')->search({ role => - { '-in' -> ['Fred', 'Barney'] } } ); + { '-in' => ['Fred', 'Barney'] } } ); $actor->set_roles(\@roles); # Replaces all of $actor's previous roles with the two named