2009-08-25 7 views
2

Dans mon application, j'ai 2 table, livres et tags, et la table de liens book_tags. La table de liens contient également le nombre de fois où le livre a été étiqueté avec cette étiquette particulière. Je peux ajouter une étiquette en faisantComment puis-je obtenir des valeurs de la table de liens dans DBIx :: Class?

$book->add_tag($tag, { tag_count => 10 }); 

Cependant lorsque je récupère les tags pour un livre

@tags = $book->tags(); 

il ne semble pas retourner les valeurs de la table de liaison.

Y at-il un moyen d'obtenir les valeurs de la table de liaison sans le faire à la main?

Répondre

2

Puisque vous avez une jointure table nommée book_tags, vous devrez créer un à la relation has_manymany_to_many relation de la table books de la table books lui-même. La relation has_many doit récupérer les id s des étiquettes associées au livre à partir de la table book_tags. Vous pourriez avoir à ajouter des relations similaires à:

En Your::App::Schema::Result::Book:

__PACKAGE__->has_many(book_tags => 'Your::App::Schema::Result::BookTag', 'book_id'); 

__PACKAGE__->many_to_many(tags => 'book_tags', 'tag'); 

En Your::App::Schema::Result::BookTag:

__PACKAGE__->belongs_to(tag => 'Your::App::Schema::Result::Tag', 'tag_id'); 
+1

Merci pour l'exemple. J'ai eu du mal à trouver un exemple d'utilisation d'une table de liaison avec cet ORM. A été capable de l'appliquer avec succès à mon projet. – jjohn

0

Merci! J'ai déjà fait cette partie, et ça fonctionne.

Mes tableaux ressemblent à ceci:

LIVRE:

book_id book_title [other fields] 

TAG:

tag_id tag_name [other fields] 

BOOK_TAG:

book_id tag_id tag_count 

J'ai donc beaucoup à plusieurs relation entre les étiquettes et les livres avec un attribut supplémentaire, tag_count, qui est stocké dans la table de liens.

je peux ajouter une balise à un livre en faisant

$book->add_to_tags($tag, { tag_count => 10 }); 

qui renseigne le champ de tag_count dans la table BOOK_TAG.

Mais quand je fais

$book->tags(); 

il ne récupère pas automatiquement champ tag_count de BOOK_TAG. Je peux écrire

$tag = $schema->resultset('BookTag')->find({ book_id=>$book->book_id, tag=>$tag->tag_id }); 
$tag_count = $tag->tag_count(); 

Je suis en train de voir s'il y a un moyen plus facile d'obtenir l'attribut supplémentaire de la table de liens.

1

Vous pouvez proxy propriétés par le biais des relations comme celle-ci:

Schema::Tag->has_many('book_tags' => 'Schema::BookTag', 
    undef, { 
    proxy => [ 'tag_count' ], 
    } 
); 

Ensuite, vous pouvez accéder à 'tag_count' comme ceci:

my $tag_rs = $book->tags; 
for(my $tag = $tag_rs->next){ 
    print $tag->tag_count; 
} 

Vous pouvez trouver plus au relationship docs.

Questions connexes