DBIx-Class
view release on metacpan or search on metacpan
lib/DBIx/Class/ResultSet.pm view on Meta::CPAN
my @current_group_by = map
{ $_ =~ /\./ ? $_ : "$attrs->{alias}.$_" }
@$existing_group_by
;
if (
join ("\x00", sort @current_group_by)
ne
join ("\x00", sort @{$attrs->{columns}} )
) {
$self->throw_exception (
"You have just attempted a $op operation on a resultset which does group_by"
. ' on columns other than the primary keys, while DBIC internally needs to retrieve'
. ' the primary keys in a subselect. All sane RDBMS engines do not support this'
. ' kind of queries. Please retry the operation with a modified group_by or'
. ' without using one at all.'
);
}
}
$subrs = $subrs->search({}, { group_by => $attrs->{columns} });
}
$guard = $storage->txn_scope_guard;
for my $row ($subrs->cursor->all) {
push @$cond, { map
{ $idcols->[$_] => $row->[$_] }
(0 .. $#$idcols)
};
}
}
}
my $res = $cond ? $storage->$op (
$rsrc,
$op eq 'update' ? $values : (),
$cond,
) : '0E0';
$guard->commit if $guard;
return $res;
}
=head2 update
=over 4
=item Arguments: \%values
=item Return Value: $underlying_storage_rv
=back
Sets the specified columns in the resultset to the supplied values in a
single query. Note that this will not run any accessor/set_column/update
triggers, nor will it update any result object instances derived from this
resultset (this includes the contents of the L<resultset cache|/set_cache>
if any). See L</update_all> if you need to execute any on-update
triggers or cascades defined either by you or a
L<result component|DBIx::Class::Manual::Component/WHAT IS A COMPONENT>.
The return value is a pass through of what the underlying
storage backend returned, and may vary. See L<DBI/execute> for the most
common case.
=head3 CAVEAT
Note that L</update> does not process/deflate any of the values passed in.
This is unlike the corresponding L<DBIx::Class::Row/update>. The user must
ensure manually that any value passed to this method will stringify to
something the RDBMS knows how to deal with. A notable example is the
handling of L<DateTime> objects, for more info see:
L<DBIx::Class::Manual::Cookbook/Formatting DateTime objects in queries>.
=cut
sub update {
my ($self, $values) = @_;
$self->throw_exception('Values for update must be a hash')
unless ref $values eq 'HASH';
return $self->_rs_update_delete ('update', $values);
}
=head2 update_all
=over 4
=item Arguments: \%values
=item Return Value: 1
=back
Fetches all objects and updates them one at a time via
L<DBIx::Class::Row/update>. Note that C<update_all> will run DBIC defined
triggers, while L</update> will not.
=cut
sub update_all {
my ($self, $values) = @_;
$self->throw_exception('Values for update_all must be a hash')
unless ref $values eq 'HASH';
my $guard = $self->result_source->schema->txn_scope_guard;
$_->update({%$values}) for $self->all; # shallow copy - update will mangle it
$guard->commit;
return 1;
}
=head2 delete
=over 4
=item Arguments: none
=item Return Value: $underlying_storage_rv
=back
Deletes the rows matching this resultset in a single query. Note that this
will not run any delete triggers, nor will it alter the
L<in_storage|DBIx::Class::Row/in_storage> status of any result object instances
derived from this resultset (this includes the contents of the
L<resultset cache|/set_cache> if any). See L</delete_all> if you need to
execute any on-delete triggers or cascades defined either by you or a
L<result component|DBIx::Class::Manual::Component/WHAT IS A COMPONENT>.
The return value is a pass through of what the underlying storage backend
returned, and may vary. See L<DBI/execute> for the most common case.
=cut
sub delete {
my $self = shift;
$self->throw_exception('delete does not accept any arguments')
if @_;
return $self->_rs_update_delete ('delete');
}
=head2 delete_all
=over 4
=item Arguments: none
=item Return Value: 1
=back
Fetches all objects and deletes them one at a time via
L<DBIx::Class::Row/delete>. Note that C<delete_all> will run DBIC defined
triggers, while L</delete> will not.
=cut
sub delete_all {
my $self = shift;
$self->throw_exception('delete_all does not accept any arguments')
if @_;
my $guard = $self->result_source->schema->txn_scope_guard;
$_->delete for $self->all;
$guard->commit;
return 1;
}
=head2 populate
=over 4
=item Arguments: [ \@column_list, \@row_values+ ] | [ \%col_data+ ]
=item Return Value: L<\@result_objects|DBIx::Class::Manual::ResultClass> (scalar context) | L<@result_objects|DBIx::Class::Manual::ResultClass> (list context)
=back
Accepts either an arrayref of hashrefs or alternatively an arrayref of
arrayrefs.
=over
=item NOTE
The context of this method call has an important effect on what is
( run in 0.966 second using v1.01-cache-2.11-cpan-d8267643d1d )