Schrift
[thread]10927[/thread]

DBIx::Class

Leser: 3


<< >> 4 Einträge, 1 Seite
Froschpopo
 2007-11-30 17:57
#103311 #103311
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ich muss jetzt doch nochmal nerven:
Irgendwie ist mir das Teil doch etwas zu hoch und ich finde einfach keinen Einstieg. Normalerweise habe ich ja immer ein Beispiel, mit dem ich herumexperimentiere. Aber soweit kommts bei diesem DBIx::Class garnicht. Da nutzt mir auch das PDF von renee herzlich wenig, weil mir das zu theoretisch ist. Ich kann das zwar verstehen, aber ich brauche mal ein kleines Copy & Paste-Beispiel.

Angenommen ich müsste folgendes realisieren:

Code: (dl )
SELECT vorname, nachname FROM users WHERE user_id = ?
renee
 2007-11-30 21:11
#103333 #103333
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
package Froschpopo::Model::Database;

use base qw/DBIx::Class::Schema/;

__PACKAGE__->load_classes(qw/
    User
/);

1;


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Froschpopo::Model::Database::User;

use strict;
use warnings;
use base qw(DBIx::Class);

__PACKAGE__->load_components( qw(PK::Auto Core) );
__PACKAGE__->table( 'user' );

__PACKAGE__->add_columns( qw(
    user_id
    vorname
    nachname
));
__PACKAGE__->set_primary_key( 'user_id' );


1;


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

use strict;
use warnings;
use Froschpopo::Model::Database;

my $schema = Froschpopo::Model::Database->connect($alles_wie_bei_dbi);
my ($user) = $schema->resultset( 'User' )->search({
    user_id => $user_id,
});

print $user->vorname," ", $user->nachname;


Es gibt aber weitere Beispiel bei CPAN:DBIx::Class und im Tutorial...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Froschpopo
 2007-11-30 21:43
#103334 #103334
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
verstehe.
Aber was ist, wenn die Tabellen, Spalten und WHERE-Klausel im Script bestimmt wird?
Das ist nämlich das tolle an SQL::Abstract:

Ich habe hier mal ein Beispiel gemacht, wie ich gerne arbeiten möchte und was ich gern mit DBIx::Class umsetzen möchte:
Code (perl): (dl )
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
#!/usr/bin/perl

use strict;
use warnings;
use SQL::Abstract;
use CGI;

my $cgi = new CGI;

my $sql = SQL::Abstract->new;

my @tables = ('users');

my %where = ('users.geschlecht' => 'w');

if ($cgi->param('nur_user_mit_bild')) {
        push @tables, 'fotos';
        $where{'fotos.user_id'} = \'= users.id';
}

my ($sth, @bind) = $sql->select(\@tables, 'users.id', \%where);


print $sth,"\n"; 
#SELECT users.id FROM users WHERE ( users.geschlecht = ? )


Ich möchte die ganzen Parameter gerne im Script zusammenstellen können.
Ich verstehe dazu auch diese ganze Sache mit dem __PACKAGE__ nicht.
Warum schreibst du das einfach so dort hinein? Warum machst du kein Objekt?
renee
 2007-11-30 22:26
#103339 #103339
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das bestimmt man im Prinzip schon bei der Erstellung der Klassen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
package Froschpopo::Model::Database;

use base qw/DBIx::Class::Schema/;

__PACKAGE__->load_classes(qw/
    User
    Fotos
/);

1;


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package Froschpopo::Model::Database::User;

use strict;
use warnings;
use base qw(DBIx::Class);

__PACKAGE__->load_components( qw(PK::Auto Core) );
__PACKAGE__->table( 'user' );

__PACKAGE__->add_columns( qw(
    user_id
    vorname
    nachname
));
__PACKAGE__->set_primary_key( 'user_id' );

__PACKAGE__->has_many( Fotos => 'Froschpopo::Model:Database::Foto',
                      { 'foreign.user_id' => 'self.user_id' } );

1;


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package Froschpopo::Model::Database::Foto;

use strict;
use warnings;
use base qw(DBIx::Class);

__PACKAGE__->load_components( qw(PK::Auto Core) );
__PACKAGE__->table( 'fotos' );

__PACKAGE__->add_columns( qw(
    foto_id
    user_id
    path
));
__PACKAGE__->set_primary_key( 'foto_id' );

__PACKAGE__->has_many( User => 'Froschpopo::Model:Database::User',
                      { 'foreign.user_id' => 'self.user_id' } );

1;


Code (perl): (dl )
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
#!/usr/bin/perl

use strict;
use warnings;

use CGI;

use Froschpopo::Model::Database;

my $cgi = CGI->new;

my $schema = Froschpopo::Model::Database->connect($alles_wie_bei_dbi);
my ($user) = $schema->resultset( 'User' )->search({
    user_id => $user_id,
});

if( $user ){
    print $user->vorname," ", $user->nachname;
    
    if ($cgi->param('nur_user_mit_bild')) {
        my @fotos = $user->Fotos;
        for my $foto ( @fotos ){
            print "Foto: ", $foto->path,"\n";
        }
    }
}
else{
    print "Kein User gefunden";
}


Durch das "Navigieren" durch die Tabellen brauchst Du gar nicht vorher zu sagen, aus welchen Tabellen Du etwas haben willst.

Die Fo.to-Tabelle wird auch erst abgefragt, wenn der CGI-Parameter gesetzt ist
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 4 Einträge, 1 Seite



View all threads created 2007-11-30 17:57.