DBIx-EAV
view release on metacpan or search on metacpan
lib/DBIx/EAV/Entity.pm view on Meta::CPAN
}
sub _get_related {
my ($self, $relname, $query, $options) = @_;
my $rel = $self->type->relationship($relname);
my ($our_side, $their_side) = $rel->{is_right_entity} ? qw/ right left / : qw/ left right /;
my $related_type = $self->eav->type_by_id($rel->{"${their_side}_entity_type_id"});
$query //= {};
$query->{$rel->{incoming_name}} = $self;
$self->eav->resultset($related_type)->search($query, $options);
}
sub load_attributes {
my ($self, @attrs) = @_;
die "Can't load_attributes(): this entity has no id!"
unless defined $self->id;
my $eav = $self->eav;
my $type = $self->type;
@attrs = $type->attributes( no_static => 1, names => 1 )
if @attrs == 0;
# build sql query: one aliases subselect for each attribute
my $sql_query = 'SELECT ' . join(', ', map {
my $attr_spec = $type->attribute($_);
my $value_table = $eav->table('value_'. $attr_spec->{data_type} );
sprintf "(SELECT value FROM %s WHERE entity_id = %d AND attribute_id = %d) AS %s",
$value_table->name,
$self->id,
$attr_spec->{id},
$_;
} @attrs);
# fetch data
my ($rv, $sth) = $eav->dbh_do($sql_query);
my $data = $sth->fetchrow_hashref;
die "load_attributes() failed! No data returned from database!"
unless ref $data eq 'HASH';
my $raw = $self->raw;
my $total = 0;
# adopt data
for (keys %$data) {
$raw->{$_} = $data->{$_};
$total++;
}
# return the number os attrs loaded
$total;
}
sub update {
my $self = shift;
$self->set(@_)->save;
}
sub set {
my $self = shift;
my $numargs = scalar(@_);
die 'Call set(\%data) or set($attr, $value)'
if 1 > $numargs || $numargs > 2;
if ($numargs == 2) {
$self->_set(@_);
}
elsif ($numargs == 1) {
die "You must pass a hashref set()" unless ref $_[0] eq 'HASH';
while (my ($k, $v) = each %{$_[0]}) {
$self->_set($k, $v);
}
}
$self;
}
sub _set {
my ($self, $attr_name, $value) = @_;
my $type = $self->type;
if ($type->has_relationship($attr_name)) {
return $self->_set_related($attr_name, $value);
}
my $attr = $self->type->attribute($attr_name);
die "Sorry, you can't set the 'id' attribute."
if $attr_name eq 'id';
# same value
return if defined $value &&
exists $self->raw->{$attr_name} &&
defined $self->raw->{$attr_name} &&
$value eq $self->raw->{$attr_name};
# remember original value
$self->_modified->{$attr_name} = $self->raw->{$attr_name}
unless exists $self->_modified->{$attr_name};
# set
# TODO use type-specific deflator
$self->raw->{$attr_name} = $value;
}
sub _set_related {
my ($self, $relname, $data) = @_;
my $type = $self->type;
my $rel = $type->relationship($relname);
die "You can only pass related data in the form of a hashref, blessed Entity object, or an arrayref of it."
unless ref $data eq 'HASH' || ref $data eq 'ARRAY' || (blessed $data && $data->isa('DBIx::EAV::Entity'));
( run in 0.800 second using v1.01-cache-2.11-cpan-7fcb06a456a )