X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRelationship%2FCascadeActions.pm;h=3d5da76390ae59cba06a988b4a5c42bae5c6216a;hb=472a4e8f5437429e5dfae20abd709462a6309979;hp=b26345b9105f8ac3709f1bd3cadaa5b691fad427;hpb=503536d5b216b4d85ed3f5420f3db93d4c033d86;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Relationship/CascadeActions.pm b/lib/DBIx/Class/Relationship/CascadeActions.pm index b26345b..3d5da76 100644 --- a/lib/DBIx/Class/Relationship/CascadeActions.pm +++ b/lib/DBIx/Class/Relationship/CascadeActions.pm @@ -1,33 +1,43 @@ -package DBIx::Class::Relationship::CascadeActions; +package # hide from PAUSE + DBIx::Class::Relationship::CascadeActions; + +use strict; +use warnings; sub delete { my ($self, @rest) = @_; - return $self->NEXT::ACTUAL::delete(@rest) unless ref $self; + return $self->next::method(@rest) unless ref $self; # I'm just ignoring this for class deletes because hell, the db should # be handling this anyway. Assuming we have joins we probably actually # *could* do them, but I'd rather not. - my $ret = $self->NEXT::ACTUAL::delete(@rest); + my $ret = $self->next::method(@rest); - my %rels = %{ $self->_relationships }; + my $source = $self->result_source; + my %rels = map { $_ => $source->relationship_info($_) } $source->relationships; my @cascade = grep { $rels{$_}{attrs}{cascade_delete} } keys %rels; foreach my $rel (@cascade) { - $self->search_related($rel)->delete; + $self->search_related($rel)->delete_all; } return $ret; } sub update { my ($self, @rest) = @_; - return $self->NEXT::ACTUAL::update(@rest) unless ref $self; + return $self->next::method(@rest) unless ref $self; # Because update cascades on a class *really* don't make sense! - my $ret = $self->NEXT::ACTUAL::update(@rest); + my $ret = $self->next::method(@rest); - my %rels = %{ $self->_relationships }; + my $source = $self->result_source; + my %rels = map { $_ => $source->relationship_info($_) } $source->relationships; my @cascade = grep { $rels{$_}{attrs}{cascade_update} } keys %rels; foreach my $rel (@cascade) { - $_->update for $self->$rel; + next if ( + $rels{$rel}{attrs}{accessor} eq 'single' + && !exists($self->{_relationship_data}{$rel}) + ); + $_->update for grep defined, $self->$rel; } return $ret; }