2010-03-11 1 views
6

Я мочу ноги в DBIx::Class — любя его до сих пор.Как я могу отфильтровать набор записей 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, который запускается на выполнение является:

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

Я искал CPAN, Google и так и не смогли понять, как применять 2 условия для одной и той же колонке. Вся документация, которую я смог найти, показывает, как фильтровать более одного столбца, но не 2 условия в одном столбце.

Уверен, что мне не хватает чего-то очевидного. Может ли кто-нибудь здесь указать мне на это?

ответ

5

IIRC, вы должны быть в состоянии передать ссылку на массив из нескольких условий поиска, например (каждый в своем собственном hashref.):

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

Edit: К сожалению, nervermind. Это делает OR, в отличие от AND.

Это похоже на правильный путь, чтобы сделать это, чтобы поставить hashref для одного status_date:

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

Этот материал описан в SQL::Abstract, который DBIC использует под капотом.

+0

Отлично! Это именно то, что мне нужно! Если только это было задокументировано лучше ... Спасибо большое, friedo, я его высоко ценю! – BrianH

1

Существует в SQL и в DBIx :: Class BETWEEN она поддерживается:

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

 Смежные вопросы

  • Нет связанных вопросов^_^