Hallo allerseits,
im Rahmen eines neuen Projektes bin ich das erste mal auf ORM gestoßen und habe mich ein wenig in die Doku von DBIx::Class eingelesen. Leider sind die Beispiele nicht sehr tief gehend und ich weiß nicht genau, wie man ein "RealWorld"-DBIx::Class-Projekt angeht. Konkrete Frage: Benutzt man die einzelnen Schema-Klassen lediglich als Datenbankabstraktionsebene oder leitet man seine eigenen Klassen irgendwie davon ab?
Gruß + Dank,
H1
User since
2003-08-04
14371
Artikel
ModeratorIn
Vielleicht hilft Dir das hier etwas weiter:
http://renee-baecker.de/talks/DBIx_Class.pdf
Ok, vielleicht habe ich nicht aufmerksam genug gelesen, aber meine Frage ist damit nicht wirklich beantwortet. Wenn der Link eine Antwort auf meine Frage beinhaltet, dann, dass man die DB-Schemas benutzt, wie man früher DBI benutzt hätte, nur halt abstrahiert. Dass aber die einzelnen Schemas eher nicht dazu gedacht sind, vererbt und mit Funktionalität angereichert zu werden?
Oder anders gefragt: Wenn einer deiner Spieler, die in der Datenbank stehen, Methoden bekommen soll ( z. B. eine Fußballsimulation soll durchgeführt werden und der Spieler bewegt sich über den Platz mit meinetwegen run() oder so und das soll nicht in die DB), würdest Du diese Methoden irgendwie in die Schema-Klasse reinschreiben, eine neue Spielerklasse machen, die von My::DB::Spieler erbt und die Funktionalität ergänzt oder eine neue Spielerklasse, die eine Membervariable vom Typ My::DB?
Grüße, H1
User since
2003-08-04
14371
Artikel
ModeratorIn
Ich würde das ungefähr so lösen:
Die Schemas sind nur für die Daten in der Datenbank da, nicht für das "Verhalten" eines Spielers.
Eine Klasse Spieler, der den Spieler an sich realisiert. Diese Klasse hat die Methoden "run", "kick",...
Wenn Daten wie "Anzahl Tore", "Name", "Verein" in der DB sind, dann werden die Attribute über die Schema-Klasse gesetzt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package YourApp::Spieler;
use strict;
use warnings;
use My::DB;
my $schema = My::DB->connect( ... );
sub new{
my ($class,$name) = @_;
my $self = bless {}, $class;
_init();
$self;
}
sub run {
print "der Spieler rennt";
}
sub kick {
print "der Spieler passt zu einem Mitspieler";
if( $is_goal ){
my $info = $self->_info;
$info->update( Anzahl_Tore => $info->Anzahl_Tore + 1 );
}
}
sub _info {
my ($self) = @_;
unless( $self->{info} ){
my $info = $schema->resultset( 'Spieler' )->search( Name => $name );
$self->{info} = $info;
}
$self->{info}
}
1;
DB und Controller sollten getrennt sein...
Yepp, mit der Antwort kann ich was anfangen. Danke schön!