my $ident_cond = $self->ident_condition;
$self->throw_exception("Cannot safely delete a row in a PK-less table")
if ! keys %$ident_cond;
+ foreach my $column (keys %$ident_cond) {
+ $self->throw_exception("Can't delete the object unless it has loaded the primary keys")
+ unless exists $self->{_column_data}{$column};
+ }
$self->result_source->storage->delete(
$self->result_source->from, $ident_cond);
$self->in_storage(undef);
return undef;
}
+sub has_column_loaded {
+ my ($self, $column) = @_;
+ $self->throw_exception( "Can't call has_column data as class method" ) unless ref $self;
+ return 1
+ if exists $self->{_column_data}{$column};
+ return 0;
+}
+
=head2 get_columns
my %data = $obj->get_columns;
my $schema;
foreach my $pre (keys %{$prefetch||{}}) {
my $pre_val = $prefetch->{$pre};
- # if first prefetch item is arrayref, assume this is a has_many prefetch
- # and that objects are pre inflated (TODO: check arrayref contents using "ref" to make sure)
- if( ref $pre_val->[0] eq 'ARRAY' ) {
- $new->related_resultset($pre)->set_cache( $pre_val->[0] );
- }
- else {
- my $pre_source = $source->related_source($pre);
- $class->throw_exception("Can't prefetch non-existent relationship ${pre}") unless $pre_source;
+ my $pre_source = $source->related_source($pre);
+ $class->throw_exception("Can't prefetch non-existent relationship ${pre}")
+ unless $pre_source;
+ #warn Data::Dumper::Dumper($pre_val)." ";
+ if (ref($pre_val->[0]) eq 'ARRAY') { # multi
+ my @pre_objects;
+ foreach my $pre_rec (@$pre_val) {
+ unless ($pre_source->primary_columns == grep { exists $pre_rec->[0]{$_}
+ and !defined $pre_rec->[0]{$_} } $pre_source->primary_columns) {
+ next;
+ }
+ push(@pre_objects, $pre_source->result_class->inflate_result(
+ $pre_source, @{$pre_rec}));
+ }
+ $new->related_resultset($pre)->set_cache(\@pre_objects);
+ } else {
my $fetched;
- unless ($pre_source->primary_columns == grep { exists $prefetch->{$pre}[0]{$_}
- and !defined $prefetch->{$pre}[0]{$_} } $pre_source->primary_columns)
+ unless ($pre_source->primary_columns == grep { exists $pre_val->[0]{$_}
+ and !defined $pre_val->[0]{$_} } $pre_source->primary_columns)
{
$fetched = $pre_source->result_class->inflate_result(
- $pre_source, @{$prefetch->{$pre}});
+ $pre_source, @{$pre_val});
}
my $accessor = $source->relationship_info($pre)->{attrs}{accessor};
$class->throw_exception("No accessor for prefetched $pre")
if ($accessor eq 'single') {
$new->{_relationship_data}{$pre} = $fetched;
} elsif ($accessor eq 'filter') {
- $new->{_inflated_column}{$pre} = $fetched;
- } elsif ($accessor eq 'multi') {
- $class->throw_exception("Cache must be enabled for has_many prefetch '$pre'");
+ $new->{_inflated_column}{$pre} = $fetched;
} else {
$class->throw_exception("Prefetch not supported with accessor '$accessor'");
}