2009-08-25 3 views
2

私のアプリでは、2つのテーブル、ブック、タグ、リンクテーブルbook_tagsがあります。リンクテーブルには、書籍にこの特定のタグが付いた回数も含まれています。私はこの本DBIx :: Classのリンクテーブルから値を取得するにはどうすればよいですか?

@tags = $book->tags(); 

のタグを取得するときしかし、リンクテーブルから値を返すようには見えない

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

を行うことで、タグを追加することができます。

手作業でリンクテーブルから値を取得する方法はありますか?

答えて

2

あなたはbook_tagsという名前の結合テーブルを持っているので、あなたはbooksテーブル自体のhas_many関係にbooksテーブルからmany_to_many関係を作成する必要があります。 has_manyリレーションは、テーブルbook_tagsからブックに関連付けられたタグのidを取得する必要があります。

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

Your::App::Schema::Result::BookTagで:

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

ありがとうございます。このORMでリンクテーブルを使用する例を見つけるのは難しかったです。これを私のプロジェクトにうまく適用できました。 – jjohn

0

感謝を!私はすでにこの部分をやって、それは動作します。

私のテーブルは次のようになります。だから私は、多対多を持って

book_id tag_id tag_count 

BOOK:

book_id book_title [other fields] 

TAG:

tag_id tag_name [other fields] 

BOOK_TAGタグと書籍との関係追加の属性、tag_countは、リンクテーブルに格納されています。

私はBOOK_TAGテーブルにtag_countフィールドを移入

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

を実行して、ブックにタグを追加することができます。

しかし、私は

$book->tags(); 

を行うときには、自動的にBOOK_TAGからtag_countフィールドを取得しません。私は書くことができます

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

リンクテーブルから余分な属性を取得する方法があるかどうかを確認しようとしています。

1

次のような関係を通じてproxyプロパティことができます:あなたはrelationship docsで詳細を見つけることができます

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

:次に、あなたは、このような 'tag_count' を

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

アクセスすることができます。

関連する問題