Как получить значения из таблицы ссылок в DBIx :: Class? - PullRequest
2 голосов
/ 25 августа 2009

В моем приложении 2 таблицы, книги и теги, а также таблица ссылок book_tags. Таблица ссылок также содержит количество раз, когда книга была помечена этим конкретным тегом. Я могу добавить тег, выполнив

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

Однако, когда я получаю теги для книги

@tags = $book->tags();

похоже, что он не возвращает значения из таблицы ссылок.

Есть ли способ получить значения из таблицы ссылок, не делая этого вручную?

Ответы [ 3 ]

2 голосов
/ 25 августа 2009

Поскольку у вас есть таблица соединения с именем book_tags, вам нужно будет создать отношение many_to_many из таблицы books к отношению has_many самой таблицы books. Отношение has_many должно извлечь id тегов, связанных с книгой, из таблицы book_tags. Возможно, вам придется добавить отношения, подобные:

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

В Your::App::Schema::Result::BookTag:

__PACKAGE__->belongs_to( tag => 'Your::App::Schema::Result::Tag', 'tag_id' );
1 голос
/ 26 августа 2009

Вы можете 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;
}

Вы можете найти больше в документах по отношениям .

0 голосов
/ 26 августа 2009

Спасибо! Я уже сделал эту часть, и она работает.

Мои таблицы выглядят так:

BOOK:

book_id book_title [other fields]

TAG:

tag_id tag_name [other fields]

BOOK_TAG:

book_id tag_id tag_count

Так что у меня есть отношение многие ко многим между тегами и книгами с дополнительным атрибутом tag_count, который хранится в таблице ссылок.

Я могу добавить тег к книге, выполнив

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

заполняет поле tag_count в таблице BOOK_TAG.

Но когда я делаю

$book->tags();

это не приводит к автоматическому извлечению поля tag_count из BOOK_TAG. Я могу написать

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

Я пытаюсь выяснить, есть ли более простой способ получить дополнительный атрибут из таблицы ссылок.

...