2010-03-11 2 views
6

나는 내 발을 축축하게하고있다. DBIx::Class — 지금까지 그것을 좋아한다.같은 컬럼에서 2 가지 조건으로 Perl DBIx 레코드 세트를 필터링하는 방법은 무엇입니까?

내가 겪고있는 한 가지 문제점은 특정 날짜 범위에없는 레코드를 필터링하여 레코드를 쿼리하려고한다는 것입니다.

이 대신 평등 일치 일치의 <= 유형을 수행하는 방법을 알아 걸 렸어요 :

my $start_criteria = ">= $start_date"; 
my $end_criteria = "<= $end_date"; 
my $result = $schema->resultset('MyTable')->search(
    { 
    'status_date' => \$start_criteria, 
    'status_date' => \$end_criteria, 
    }); 

이것에 대한 분명한 문제는 필터가 해시에 있기 때문에, 나는 것입니다 "status_date"에 대한 값을 덮어 쓰고, status_date가 어디에 있는지 검색 만합니다. < = $ end_date. 실행 가져옵니다 SQL은 다음과 같습니다 나는 SO CPAN, 구글을 검색 한 동일한 컬럼이 조건을 적용하는 방법을 알아낼 수 없었다

SELECT me.* from MyTable me where status_date <= '9999-12-31' 

. 필자가 찾은 모든 문서에는 둘 이상의 열에서 필터링하는 방법이 나와 있지만 같은 열에는 두 가지 조건을 필터링하는 방법이 나와 있지 않습니다.

나는 분명히 뭔가 빠져있다. 누군가 나에게 그것을 지적 할 수 있습니까?

답변

5

IIRC, 당신은 여러 검색 조건의 배열 참조 통과 할 수 있어야한다 (예를 들어, 자신의 hashref 각을.) :

my $result = $schema->resultset('MyTable')->search(
    [ { 'status_date' => \$start_criteria }, 
    { 'status_date' => \$end_criteria }, 
    ] 
); 

편집 : 아차, nervermind. 그것은 AND와 반대로 OR을 수행합니다.

그것은 그것을 할 수있는 올바른 방법과 같은 단일 status_date에 대한 hashref을 공급하는 것입니다 :

my $result = $schema->resultset('MyTable')->search(
    { status_date => { '>=' => $start_date, '<=' => $end_date } } 
); 

이 물건은 DBIC는 후드 사용하는, SQL::Abstract에 설명되어 있습니다.

+0

딱! 그것이 내가 필요한 것입니다! 더 잘 문서화 된 경우 ... 감사합니다. friedo, 정말 고맙습니다. – BrianH

1

는, 지원되는 SQL과 DBIx의 :: 클래스 BETWEEN 있습니다 :

my $result = $schema->resultset('MyTable') 
    ->search({status_date => {between => [$start_date,$end_date]}});