2010-03-11 5 views
6

Ich bekomme meine Füße nass in DBIx::Class — liebe es so weit.Wie kann ich ein Perl-DBIx-Recordset mit 2 Bedingungen in derselben Spalte filtern?

Ein Problem, das ich renne, ist, dass ich Datensätze abfragen und Datensätze ausfiltern möchte, die sich nicht in einem bestimmten Datumsbereich befinden.

Es dauerte eine Weile, um herauszufinden, wie eine <= Art von Spiel zu tun, statt einer Gleichheit Spiel:

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

Das offensichtliche Problem dabei ist, dass, da die Filter in einem Hash sind, ist mir überschreibt den Wert für "status_date" und sucht nur dort, wo das status_datum < = $ end_date ist. Die SQL, die ausgeführt wird ist:

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

ich CPAN gesucht haben, Google und SO und nicht in der Lage, herauszufinden, wie zwei Bedingungen auf die gleiche Spalte anzuwenden. Die gesamte Dokumentation, die ich gefunden habe, zeigt, wie nach mehr als einer Spalte, aber nicht nach zwei Bedingungen in derselben Spalte gefiltert werden kann.

Ich bin sicher, ich vermisse etwas offensichtlich. Kann hier jemand auf mich hinweisen?

Antwort

5

IIRC, sollten Sie in der Lage sein, eine Array-Referenz von mehreren Suchbedingungen passieren Zum Beispiel (jeder in seiner eigenen hashref.):

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

Edit: Hoppla, nervermind. Das macht ein ODER, im Gegensatz zu einem UND.

Es sieht aus wie der richtige Weg, es zu tun ist, eine hashref für ein einzelnes status_date zu liefern:

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

Dieses Zeug ist dokumentiert in SQL::Abstract, die DBIC verwendet unter der Haube.

+0

Perfect! Genau das habe ich gebraucht! Wenn nur das besser dokumentiert wäre ... Vielen Dank, friedo, ich schätze es! – BrianH

1

Es gibt BETWEEN in SQL und in DBIx :: Class es unterstützt wird:

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