-- added support for belongs_to type relationships and better support for when the...
[dbsrgits/DBIx-Class-Historic.git] / lib / DBIx / Class / ResultSet.pm
index df5b998..31358a9 100644 (file)
@@ -34,7 +34,7 @@ In the examples below, the following table classes are used:
 
   package MyApp::Schema::Artist;
   use base qw/DBIx::Class/;
-  __PACKAGE__->load_components(qw/Core/);
+  __PACKAGE__->load_components(qw/Core/)
   __PACKAGE__->table('artist');
   __PACKAGE__->add_columns(qw/artistid name/);
   __PACKAGE__->set_primary_key('artistid');
@@ -1291,7 +1291,7 @@ Example:  Assuming an Artist Class that has many CDs Classes relating:
   print $ArtistThree->cds->count ## reponse is '2'
 
 =cut
-
+use Data::Dump qw/dump/;
 sub populate {
   my ($self, $data) = @_;
   
@@ -1304,8 +1304,35 @@ sub populate {
   } else {
     my ($first, @rest) = @$data;
 
-    my @names = grep { !ref $first->{$_} } keys %$first;
-
+       my @names = grep {!ref $first->{$_}} keys %$first;
+    my @rels = grep { $self->result_source->has_relationship($_) } keys %$first;
+    my @pks = $self->result_source->primary_columns;   
+
+       ## do the belongs_to relationships      
+    foreach my $index (0..$#{@$data})
+       {
+               foreach my $rel (@rels)
+               {
+                       next unless $data->[$index]->{$rel} && ref $data->[$index]->{$rel} eq "HASH";
+                       
+                       my $result = $self->related_resultset($rel)->create($data->[$index]->{$rel});
+                       
+                       my ($reverse) = keys %{$self->result_source->reverse_relationship_info($rel)};
+                       
+                       my $related = $result->result_source->resolve_condition(
+
+                               $result->result_source->relationship_info($reverse)->{cond},
+                               $self,                          
+                               $result,                                
+                       );
+
+                       delete $data->[$index]->{$rel};
+                       $data->[$index] = {%{$data->[$index]}, %$related};
+                       
+                       push @names, keys %$related if $index == 0;
+               }
+       }
+       
     my @values = map {
       [ map {
          defined $_ ? $_ : $self->throw_exception("Undefined value for column!")
@@ -1318,13 +1345,11 @@ sub populate {
       \@values,
     );
 
-    my @rels = grep { $self->result_source->has_relationship($_) } keys %$first;
-    my @pks = $self->result_source->primary_columns;
-
+       ## do the has_many relationships
     foreach my $item (@$data) {
 
       foreach my $rel (@rels) {
-        next unless $item->{$rel};
+        next unless $item->{$rel} && ref $item->{$rel} eq "ARRAY";
 
         my $parent = $self->find(map {{$_=>$item->{$_}} } @pks) || next;
         my $child = $parent->$rel;