2009-08-25 2 views
2

내 앱에는 2 개의 테이블, 책 및 태그와 링크 테이블 book_tags가 있습니다. 링크 테이블에는 책이이 특정 태그로 태그가 지정된 횟수도 포함됩니다. 나는이 책이 링크 테이블에서 값을 반환하지 않는 것DBIx :: Class의 링크 테이블에서 값을 가져 오는 방법은 무엇입니까?

@tags = $book->tags(); 

의 태그를 검색하지만 때 나는

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

을 수행하여 태그를 추가 할 수 있습니다.

직접 링크 테이블에서 값을 가져 오는 방법이 있습니까? 당신이 조인 테이블 book_tags 이름했기 때문에

답변

2

, 당신은 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 :

book_id book_title [other fields] 

TAG :

tag_id tag_name [other fields] 

BOOK_TAG :

book_id tag_id tag_count 

그래서 내가 가진 대다 태그와 도서 간의 관계 추가 속성 인 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(); 

쓸 수 있습니다.

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

당신은 relationship docs에서 자세한 내용을 찾을 수 있습니다

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

그리고이 같은 'tag_count하지만'를 액세스 할 수 있습니다 : 당신은 이런 관계를 통해 proxy 특성이 있습니다