- $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;
-# warn Dumper( $object->{_column_data} );
- $object->update_or_insert;
-
- # updating relations that can be done only after the row is inserted into the database
- # like has_many and many_to_many
- for my $name ( keys %$updates ){
- my $value = $updates->{$name};
- # many to many case
- if( $self->is_m2m( $name ) ) {
- my ( $pk ) = $self->_get_pk_for_related( $name );
- my @rows;
- my $result_source = $object->$name->result_source;
- 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 );
+ for my $name ( keys %post_updates ) {
+ my $info = $object->result_source->relationship_info($name);
+ _update_relation( $self, $name, $updates, $object, $info, $if_not_submitted );
+ }
+ return $object;
+}
+
+sub _get_columns_by_accessor {
+ my $self = shift;
+ my $source = $self->result_source;
+ my %columns;
+ for my $name ( $source->columns ) {
+ my $info = $source->column_info($name);
+ $info->{name} = $name;
+ $columns{ $info->{accessor} || $name } = $info;
+ }
+ return %columns;
+}
+
+sub _update_relation {
+ my ( $self, $name, $updates, $object, $info, $if_not_submitted ) = @_;
+ my $related_result =
+ $self->related_resultset($name)->result_source->resultset;
+ my $resolved;
+ if( $self->result_source->can( '_resolve_condition' ) ){
+ $resolved = $self->result_source->_resolve_condition( $info->{cond}, $name, $object );
+ }
+ else{
+ $resolved = $self->result_source->resolve_condition( $info->{cond}, $name, $object );
+ }
+
+ # warn 'resolved: ' . Dumper( $resolved ); use Data::Dumper;
+ $resolved = {}
+ if defined $DBIx::Class::ResultSource::UNRESOLVABLE_CONDITION && $DBIx::Class::ResultSource::UNRESOLVABLE_CONDITION == $resolved;
+ if ( ref $updates->{$name} eq 'ARRAY' ) {
+ my @updated_ids;
+ for my $sub_updates ( @{ $updates->{$name} } ) {
+ my $sub_object =
+ recursive_update( resultset => $related_result, updates => $sub_updates, resolved => $resolved );
+ push @updated_ids, $sub_object->id;