2014-11-24 2 views
3

내 응용 프로그램에서 결과 집합 체인을 구현하려고합니다. 나는 그런 방식으로 체인을 호출 할 때DBIx :: 프리 페치에서 동일한 테이블을 사용하는 클래스 체인 결과

package Schema::ResultSet::Category; 

use base 'DBIx::Class::ResultSet'; 

sub with_translation { 
    my ($self, $lang) = @_; 

    $self->search(
    { 
     'language.code' => $lang, 
    }, 
    { 
     prefetch => { 
     'category_i18ns' => 'language' 
     } 
    } 
); 
} 

sub with_products { 
    my ($self, $lang) = @_; 

    $self->search(
    { 
     'language.code' => $lang, 
    }, 
    { 
     prefetch => { 
     'products' => { 
      'product_i18ns' => 'language', 
     }, 
     }, 
    }, 
); 
} 

sub with_categories { 
    my ($self, $lang) = @_; 

    $self->search(
    { 
     'language.code' => $lang, 
    }, 
    { 
     prefetch => { 
     'parent' => { 
      'category_i18ns' => 'language' 
     }, 
     }, 
    } 
); 
} 

sub with_account { 
    my ($self) = @_; 

    $self->search(
    undef,{ 
    prefetch => ['account'], 
    }); 
} 

sub display { 
    my ($self) = @_; 

    $self->result_class('DBIx::Class::ResultClass::HashRefInflator'); 

    my @return = $self->all; 

    return \@return; 
} 

: 여기

내 결과 집합 클래스의 몇 가지 방법이 있습니다

my @categories = $self->db->resultset('Category')->with_translation($lang)->with_products($lang)->display; 

DBIx :: 클래스가 하나 포함 SELECT 쿼리를 생성 WHERE 절 :

SELECT [...] WHERE (language.code = ?): 'en' 

속성 및 조건에 따라 예상되는 결과 descr DBIx :: Class :: ResultSet 문서화. 하지만 어떻게 각각의 관련 'language.code'열에 대해 여러 WHERE 절을 사용하여 쿼리를 생성 할 수 있습니까? 예,이 같은 : 지금까지 내가 이해

SELECT [...] WHERE ((language.code = ?) AND (language_2.code = ?)): 'en', 'en' 

는, 문제는 검색 조건이 그래서 현재의 '언어'별칭을 검색하고에서 모든 검색 조건에서 사용하는 데 필요한 체인 통화 중에 통합되고 있다는 점이다 chain 요소가 있지만 DBIx :: Class는 이러한 기능을 제공하지 않습니다. 당신이 당신의 최종 버전을 변경하는 경우

+2

-> 검색은 매개 변수를 병합합니다. 모든 메소드가 'language.code'와 동일한 해시 키를 검색하므로 하나만 수행합니다. where 절에 여러 조건이 있기를 원하면 검색시 category_i18ns.code와 같은 테이블 이름을 사용해야합니다. – mikew

+0

합리적으로 들리 네요. 고맙습니다! – romel

답변

0

, 그것을 작동합니다 :

$self->db->resultset('Category') 
    ->with_translation($lang)->as_subselect_rs 
    ->with_products($lang)->as_subselect_rs 
    ->display; 

나는 그것이 작동 것이라 생각합니다. 문제는 프리 페치를 깨뜨릴 수 있다는 것입니다. 나는 긍정적이지 않습니다. ...

또 하나주의해야 할 점은 두 세트의 프리 페치가 있다는 것입니다. 나는 이것이 "데카르트"가 될 것이며 엄청난 양의 데이터를 되 찾을 것이라고 믿습니다. 더 나은 옵션은 2 개의 쿼리를 수행하고 출력을 perl로 병합하는 것입니다.

관련 문제