2009-08-25 7 views
2

In meiner App habe ich 2 Tabellen, Bücher und Tags und die Verknüpfungstabelle book_tags. Die Verbindungstabelle enthält auch die Anzahl der Male, die das Buch mit diesem bestimmten Tag markiert wurde. Ich kann tunWie bekomme ich Werte aus der Verknüpfungstabelle in DBIx :: Class?

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

jedoch einen Tag hinzufügen, wenn ich die Tags für ein Buch

@tags = $book->tags(); 

es scheint nicht abrufen, die Werte aus der Verknüpfungstabelle zurückzukehren.

Gibt es eine Möglichkeit, die Werte aus der Linktabelle zu erhalten, ohne es von Hand zu tun?

Antwort

2

Da Sie eine Join-Tabelle book_tags genannt, erhalten Sie eine many_to_many Beziehung von der books Tabelle in die has_many Beziehung der books Tabelle selbst erstellen müssen. Die has_many-Beziehung sollte die id s der dem Buch zugeordneten Tags aus der Tabelle book_tags abrufen. Möglicherweise müssen Beziehungen hinzufügen, ähnlich zu:

In 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'); 

In Your::App::Schema::Result::BookTag:

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

Danke für das Beispiel. Ich hatte Probleme, ein Beispiel für die Verwendung einer Verknüpfungstabelle mit diesem ORM zu finden. Konnte das erfolgreich auf mein Projekt anwenden. – jjohn

0

Dank! Ich habe diesen Teil bereits gemacht, und es funktioniert.

Meine Tabellen wie folgt aussehen:

BUCH:

book_id book_title [other fields] 

TAG:

tag_id tag_name [other fields] 

BOOK_TAG:

book_id tag_id tag_count 

So habe ich eine many-to-many Beziehung zwischen Tags und Büchern mit einem zusätzliches Attribut tag_count, das in der Verknüpfungstabelle gespeichert wird.

kann ich einen Tag ein Buch hinzufügen, indem

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

tun, die das tag_count Feld in der BOOK_TAG Tabelle auffüllt.

Aber wenn ich

$book->tags(); 

tun es nicht automatisch tag_count Feld von BOOK_TAG abrufen. Ich kann schreiben

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

Ich versuche, es zu sehen, ob ein einfacher Weg ist das zusätzliche Attribut aus der Verknüpfungstabelle zu erhalten.

1

Sie können proxy Eigenschaften durch Beziehungen wie folgt aus:

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

Dann können Sie wie folgt 'tag_count' zugreifen:

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

Sie können mehr an der relationship docs finden.

Verwandte Themen