2009-02-23 4 views
7

우리는 한쪽에 여러 유형의 객체를 처리 할 수있는 링크 테이블을 가지고 있으며 has_many를 사용하여 링크 테이블에 이러한 객체 중 하나를 가져 오는 방법을 찾을 수 없습니다.고정 조인 조건으로 DBIx :: Class 관계를 만들려면 어떻게해야합니까?

예 : 링크 테이블에는 다음이 포함됩니다 내가 대응을 얻을 수 없었다

Resource->has_many(links => 'Link', 'resource_id'); 

하지만 : 자원 측면에서의 관계를 구축

id link_id link_table resource_id 
1 1  page  3 
2 1  page  5 
3 2  page  3 
4 1  not_page 1 

충분히 쉽다 페이지 측과의 관계 :

Page->has_many(links => 'Link', 'link_id'); 

Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => 'page'}); 

이 (그다지 놀라운 일이 아니었다)는 '잘못된 확인해 콘드의 발 페이지'오류를주는 not_page 링크를 얻을 것입니다.

'오류가 발생했습니다.'오류가 발생합니다. 안으로 백 슬래시를 던지면 도움이되지 못했습니다.

DBIx::Class::Relationship::Base는 말한다 :

:

조건이 같은 내가 거기에서 여러 가지 다른 옵션을 시도

와 테이블 간의 조인의 SQL::Abstract 스타일 표현 될 필요가

Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => {'=', 'page'}}); 

하지만 전혀 성공하지 못했습니다. 난 항상 값 '페이지'를 포함하는 페이지 테이블에 다른 필드를 추가 한 경우

나는

Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => 'self.what_table_am_i'}); 

을 할 수 있지만, 거의 최적의 솔루션 없습니다.

링크 테이블을 각 유형별로 별도로 분할하는 것도 가능하지만 DBIx :: Class에 적응하기 위해 고려중인 기존 프로젝트이며 테이블을 여러 개로 분할하는 다른 장소가있을 수 있습니다 다른 테이블은 가치보다 더 번거 롭습니다.

Page->has_many(__all_links => 'Link', 'link_id'); 

sub links { 
    shift->__all_links({link_table => 'page'}); 
} 

이것은 당신이 필요합니다 여러 테이블이있는 경우 DBIx :: 클래스의 구성 요소로 전환 꽤 쉬운 것입니다 :

+0

는 "has_many"의 반대편에 "belongs_to"를 원하십니까? – jrockway

+0

has_many가 더 중요하기 때문에 필자는 필요한 것보다 더 많은 합병증을 추가하지 않기로 결정했다. 브라이언의 대답이 belongs_to 경우에 대해 수정 될 수 있기를 바랍니다. – Cebjyre

답변

3

당신은 필요한 인자와의 관계를 호출하는 래퍼 방법을 확인해야합니다 이런 종류의 조인 논리.

+0

훌륭해, 고마워. 쿠키가 있으십시오. – Cebjyre

+0

그리고 어떻게 이것을 search()와 함께 사용할 수 있습니까? 나는 시도했다 : $ c-> model ('Page') -> search (undef, {prefetch => "links"}) -> all; 하지만 그것은 말합니다 : DBIx :: 클래스 :: ResultSet :: all() : 페이지에 그런 관계 링크 –

1

그것은 그래서 같은 has_many 호출에 지정 될 수 있습니다

Page->has_many(links => 'Link', 'link_id', 
        { where => { link_table => 'page'} }); 

참조 : DBIx::Class Cookbook

관련 문제