]> Dogcows Code - chaz/p5-DBIx-Class-ResultSet-RecursiveUpdate/blobdiff - lib/DBIx/Class/ResultSet/RecursiveUpdate.pm
using Introspectable
[chaz/p5-DBIx-Class-ResultSet-RecursiveUpdate] / lib / DBIx / Class / ResultSet / RecursiveUpdate.pm
index 7115aaa7863d0bb6fe58aaf4e2c2aaa54a9fc4eb..ebdfbf8abe91a3a8ab3cb4714b8d8fdb36a91f07 100644 (file)
@@ -44,6 +44,8 @@ sub recursive_update {
         #warn Dumper($object->{_column_data}); use Data::Dumper;
     }
     $self->_delete_empty_auto_increment($object);
+    # don't allow insert to recurse to related objects - we do the recursion ourselves
+    $object->{_rel_in_storage} = 1;
     $object->update_or_insert;
 
     # updating relations that can be done only after the row is inserted into the database
@@ -53,10 +55,16 @@ sub recursive_update {
         # many to many case
         if( $self->is_m2m( $name ) ) {
                 my ( $pk ) = $self->_get_pk_for_related( $name );
-                my @values = @{$updates->{$name}};
                 my @rows;
                 my $result_source = $object->$name->result_source;
-                @rows = $result_source->resultset->search({ $pk => [ @values ] } ) if @values; 
+                for my $elem ( @{$updates->{$name}} ){
+                    if( ref $elem ){
+                        push @rows, $result_source->resultset->find( $elem );
+                    }
+                    else{
+                        push @rows, $result_source->resultset->find( { $pk => $elem } );
+                    }
+                }
                 my $set_meth = 'set_' . $name;
                 $object->$set_meth( \@rows );
         }
@@ -80,9 +88,14 @@ sub recursive_update {
 
 sub is_m2m {
     my( $self, $relation ) = @_;
+    my $rclass = $self->result_class;
+    # DBIx::Class::IntrospectableM2M
+    if( $rclass->can( '_m2m_metadata' ) ){
+        return $rclass->_m2m_metadata->{$relation};
+    }
     my $object = $self->new({});
     if ( $object->can($relation) and 
-        !$object->result_source->has_relationship($relation) and 
+        !$self->result_source->has_relationship($relation) and 
         $object->can( 'set_' . $relation)
     ){
         return 1;
@@ -92,6 +105,17 @@ sub is_m2m {
 
 sub get_m2m_source {
     my( $self, $relation ) = @_;
+    my $rclass = $self->result_class;
+    # DBIx::Class::IntrospectableM2M
+    if( $rclass->can( '_m2m_metadata' ) ){
+        return $self->result_source
+        ->related_source( 
+            $rclass->_m2m_metadata->{$relation}{relation}
+        )
+        ->related_source( 
+            $rclass->_m2m_metadata->{$relation}{foreign_relation} 
+        );
+    }
     my $object = $self->new({});
     my $r = $object->$relation;
     return $r->result_source;
This page took 0.020252 seconds and 4 git commands to generate.