[Cologne-pm] DBIx::Class joins?!?

Michael Lamertz mike at lamertz.net
Wed Jul 4 17:26:37 PDT 2007


On Wed, Jul 04, 2007 at 08:36:13PM +0200, ReneeB wrote:
> ungetestet:

und non-funktional:

    "DBIx::Class::ResultSet::search(): No such relationship genre at ./dbix line 11"

Ich scheitere alleine schon beim Join, ohne die zusaetzliche
year-Clause.

TESTBED fuer sqlite3:

---------- create.sql ----------
create table cd (
    id          integer primary key,
    name        varchar(64)
);

create table genre (
    id          integer primary key,
    name        varchar(64)
);

create table cd_genre (
    cd          integer,
    genre       integer
);

insert into cd values ( 1, 'Pop Album 1');
insert into cd values ( 2, 'Pop Album 4');
insert into cd values ( 3, 'Rock Album 1');
insert into cd values ( 4, 'Techno Album 2');
insert into cd values ( 5, 'Rock Album 2');
insert into cd values ( 6, 'Rock Album 3');
insert into cd values ( 7, 'Techno Album 1');
insert into cd values ( 8, 'Rock-Pop Album 2');
insert into cd values ( 9, 'Rock-Pop Album 1');
insert into cd values (10, 'Pop-Techno Album 1');
insert into cd values (11, 'Pop-Techno Album 2');
insert into cd values (12, 'Pop Album 2');
insert into cd values (13, 'Pop Album 3');

insert into genre values (1, 'Pop');
insert into genre values (2, 'Rock');
insert into genre values (3, 'Techno');

insert into cd_genre values (1, 1);
insert into cd_genre values (2, 1);
insert into cd_genre values (3, 2);
insert into cd_genre values (4, 3);
insert into cd_genre values (5, 2);
insert into cd_genre values (6, 2);
insert into cd_genre values (7, 3);
insert into cd_genre values (8, 1);
insert into cd_genre values (8, 2);
insert into cd_genre values (9, 1);
insert into cd_genre values (9, 2);
insert into cd_genre values (10, 1);
insert into cd_genre values (10, 3);
insert into cd_genre values (11, 1);
insert into cd_genre values (11, 3);
insert into cd_genre values (12, 1);
insert into cd_genre values (13, 1);
---------- create.sql ----------

---------- Schema.pm ----------
package Schema;

use base qw{ DBIx::Class::Schema };

__PACKAGE__->load_classes( qw{ Cd CdGenre Genre } );

1;
---------- Schema.pm ----------

---------- Schema/Cd.pm ----------
package Schema::Cd;

use strict;
use warnings;

use base qw{ DBIx::Class };

__PACKAGE__->load_components( qw{ PK::Auto Core } );

__PACKAGE__->table('cd');
__PACKAGE__->add_columns( qw{ id name } );
__PACKAGE__->set_primary_key( 'id' );

__PACKAGE__->has_many( cd_genre => 'Schema::CdGenre', 'genre' );
__PACKAGE__->many_to_many( 'cds' => 'cd_genre', 'cd' );

1;
---------- Schema/Cd.pm ----------

---------- Schema/CdGenre.pm ----------
package Schema::CdGenre;

use strict;
use warnings;

use base qw{ DBIx::Class };

__PACKAGE__->load_components( qw{ PK::Auto Core } );

__PACKAGE__->table('cd_genre');
__PACKAGE__->add_columns( qw{ cd genre } );
__PACKAGE__->set_primary_key( qw{ cd genre } );
__PACKAGE__->belongs_to( cd => 'Schema::Cd' );
__PACKAGE__->belongs_to( genre => 'Schema::Genre' );

1;
---------- Schema/CdGenre.pm ----------

---------- Schema/Genre.pm ----------
package Schema::Genre;

use strict;
use warnings;

use base qw{ DBIx::Class };

__PACKAGE__->load_components( qw{ PK::Auto Core } );

__PACKAGE__->table('genre');
__PACKAGE__->add_columns( qw{ id name } );
__PACKAGE__->set_primary_key( 'id' );

__PACKAGE__->has_many( cd_genre => 'Schema::CdGenre', 'cd' );
__PACKAGE__->many_to_many( 'genres' => 'cd_genre', 'genre' );

1;
---------- Schema/Genre.pm ----------

---------- dbix ----------
#!/usr/bin/perl

use strict;
use warnings;

use Schema;

$\ = "\n";

my $schema = Schema->connect( 'dbi:SQLite:cd.db' );
my @techno = $schema->resultset( 'Cd' )->search(
    { 'genre.name' => 'Techno' },
    { join => [ qw{ cd_genre genre } ] }
);

print $_->name foreach (@techno);
---------- dbix ----------

Er hat 'genre' ja als unbekannte Relation angemeckert.  Stimmt ja im
Grunde auch, denn im many_to_many heisst der Bezeichner 'genres'.  Das
macht aber keinerlei Unterschied, und die Doku sagt ja ohnehin, dass
'many_to_many' keine echte Relation ist.

*Grummel*

-- 
                 Michael Lamertz - Sandstr. 122 - 50226 Frechen
         M: +49 171 6900310 / T: +49 2234 204947 / F: +49 2234 4358725
           www.perl-ronin.de - www.fuss-und-hand.de - www.lamertz.net
      mlamertz at perl-ronin.de - michael at fuss-und-hand.de - mike at lamertz.net


More information about the Cologne-pm mailing list