2010-03-11 4 views
6

Mi sto bagnando i piedi in DBIx::Class — amandolo così lontano.Come posso filtrare un recordset DBIx Perl con 2 condizioni sulla stessa colonna?

Un problema che sto incontrando è che voglio interrogare i record, filtrando i record che non si trovano in un certo intervallo di date.

Mi c'è voluto un po 'per scoprire come fare un <= tipo di partita, invece di partite uguaglianza:

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

Il problema evidente di questo è che, poiché i filtri sono in un hash, io sono sovrascrivendo il valore per "status_date", e sto solo cercando dove lo status_date < = $ end_date. Lo SQL che viene eseguito è:

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

Ho cercato CPAN, Google e così e non sono stati in grado di capire come applicare 2 condizioni alla stessa colonna. Tutta la documentazione che sono stato in grado di trovare mostra come filtrare su più di 1 colonna, ma non 2 condizioni sulla stessa colonna.

Sono sicuro che mi manca qualcosa di ovvio. Qualcuno può indicarlo?

risposta

5

IIRC, si dovrebbe essere in grado di passare un riferimento ad array di molteplici condizioni di ricerca, ad esempio (ognuno a suo rifhash.):

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

Edit: Ops, nervermind. Questo fa un OR, al contrario di un AND.

Sembra che il modo giusto per farlo è quello di fornire un rifhash per un singolo status_date:

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

Questa roba è documentato in SQL::Abstract, che utilizza DBIC sotto il cofano.

+0

Perfetto! Questo è esattamente ciò di cui avevo bisogno! Se solo questo fosse meglio documentato ... Grazie mille, caro, lo apprezzo! – BrianH

1

C'è BETWEEN in SQL e in DBIx :: Class è supportato:

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