[Munich-pm] Elche einfrieren - oder: Alle Wege führen nach ORM
Renee B
pm.list at perl-services.de
Di Aug 1 23:13:39 PDT 2017
Am 02.08.2017 um 01:47 schrieb Harald Jörg:
>
> Das soll dann in etwa so aussehen:
>
> package New::Class;
> use Moose;
> extends 'Old::Class';
> with 'My::MooseX::ORM';
>
> # ...und dann später...
> my $object = New::Class->new(%params);
> my $id = $object->store;
>
> # am nächsten Tag:
> my $object = New::Class->load_object($id);
> my $objects_ref = New::Class->load; # lädt die ganze Tabelle
Ein Ansatz wäre, ein eigenes Attribut für Attribute zu schreiben:
package DBAttribute;
use Moose;
extends 'Moose::Meta::Attribute';
has is_column => (
is => 'rw',
isa => 'Int',
);
no Moose;
1;
In einer Rolle kannst Du dann folgendes machen:
package DBRole;
sub store {
my ($self, %param) = @_;
_check_table(); # check if table exists, add the table if it's
missing
if ( $entry_exists ) {
$self->_update(%param);
}
else {
$self->_insert(%param);
}
}
sub load { ... }
sub load_objects { ... }
sub insert {
my ($self, %param) = @_;
my $meta = $self->meta;
my @attributes = $meta->get_attribute_list;
my @columns = map{ $meta->get_attribute( $_ ) }@attributes;
my %columns;
for my $attribute ( @trackable ) {
if (
$attribute->isa( 'DBAttribute' ) &&
$attribute->is_column
) {
my $name = $attribute->name;
$columns{$name} = $self->$attribute();
}
}
my $table = ...; # get class name from meta data
my $column_names = join ', ', keys %columns;
my $placeholders = join ', ', ('?') x keys %columns;
my $SQL = "INSERT INTO $table ( $column_names ) values (
$placeholders )";
$sth->execute( values %columns );
}
In der New::Class dann:
package New::Class;
use Moose;
extends 'Old::Class';
with 'My::MooseX::ORM';
with 'DBRole';
has id => (
is => 'ro',
isa => Int,
is_column => 1,
);
# ...und dann später...
my $object = New::Class->new(%params);
my $id = $object->store;
# am nächsten Tag:
my $object = New::Class->load_object($id);
my $objects_ref = New::Class->load; # lädt die ganze Tabelle
Du musst Dir aber noch überlegen, wie Du mehr Spalteninformationen (z.B. Datentyp) etc. ablegen willst oder ob Du das auf Basis vorhandener Werte ermitteln willst...
- Renée
Mehr Informationen über die Mailingliste Munich-pm