return $self->result_source
->related_source($relname)
->resultset
- ->find_or_new($data);
+ ->find_or_create($data);
}
return $self->find_or_new_related($relname, $data);
}
my $reverse = $source->reverse_relationship_info($relname);
foreach my $obj (@cands) {
$obj->set_from_related($_, $self) for keys %$reverse;
- my $them = { $obj->get_columns };
+ my $them = { $obj->get_inflated_columns };
if ($self->__their_pk_needs_us($relname, $them)) {
$obj = $self->find_or_create_related($relname, $them);
} else {
my $self = shift;
if (ref $self) {
$self->throw_exception( "Not in database" ) unless $self->in_storage;
- my $ident_cond = $self->ident_condition;
+ my $ident_cond = $self->{_orig_ident} || $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) {
=cut
sub set_column {
- my $self = shift;
- my ($column) = @_;
+ my ($self, $column, $new_value) = @_;
+
$self->{_orig_ident} ||= $self->ident_condition;
- my $old = $self->get_column($column);
- my $ret = $self->store_column(@_);
+ my $old_value = $self->get_column($column);
+
+ $self->store_column($column, $new_value);
$self->{_dirty_columns}{$column} = 1
- if (defined $old xor defined $ret) || (defined $old && $old ne $ret);
+ if (defined $old_value xor defined $new_value) || (defined $old_value && $old_value ne $new_value);
# XXX clear out the relation cache for this column
delete $self->{related_resultsets}{$column};
- return $ret;
+ return $new_value;
}
=head2 set_columns
sub get_from_storage {
my $self = shift @_;
my $attrs = shift @_;
- my @primary_columns = map { $self->$_ } $self->primary_columns;
my $resultset = $self->result_source->resultset;
if(defined $attrs) {
$resultset = $resultset->search(undef, $attrs);
}
- return $resultset->find(@primary_columns);
+ return $resultset->find($self->{_orig_ident} || $self->ident_condition);
}
=head2 throw_exception