2

私のアプリには、books と tags という 2 つのテーブルと、リンク テーブル book_tags があります。リンク テーブルには、書籍がこの特定のタグでタグ付けされた回数も含まれています。次のようにしてタグを追加できます

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

ただし、本のタグを取得すると

@tags = $book->tags();

リンクテーブルから値を返していないようです。

手動で行わずにリンク テーブルから値を取得する方法はありますか?

4

3 に答える 3

2

という名前の結合テーブルがあるため、テーブルからテーブル自体の関係への関係book_tagsを作成する必要があります。リレーションは、本に関連付けられたタグの をテーブルから取得する必要があります。次のような関係を追加する必要がある場合があります。many_to_manybookshas_manybookshas_manyidbook_tags

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' );
于 2009-08-25T09:27:40.710 に答える
1

proxy次のような関係を介してプロパティを作成できます。

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

次に、次のように「tag_count」にアクセスできます。

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

詳細については、リレーションシップドキュメントをご覧ください。

于 2009-08-26T03:49:25.433 に答える
0

ありがとう!私はすでにこの部分を行っており、うまくいきます。

私のテーブルは次のようになります。

本:

book_id book_title [other fields]

鬼ごっこ:

tag_id tag_name [other fields]

BOOK_TAG:

book_id tag_id tag_count

したがって、リンク テーブルに格納されている追加の属性 tag_count を使用して、タグと本の間に多対多の関係があります。

次のようにして、本にタグを追加できます

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

これにより、BOOK_TAG テーブルの tag_count フィールドに入力されます。

しかし、私がするとき

$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();

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

于 2009-08-25T21:53:42.323 に答える