Как я могу отфильтровать набор записей Perl DBIx с 2 условиями в одном столбце? - PullRequest
6 голосов
/ 11 марта 2010

Я промочил ноги в DBIx :: Class & mdash; люблю это до сих пор.

Одна проблема, с которой я сталкиваюсь, заключается в том, что я хочу запрашивать записи, отфильтровывая записи, которые не находятся в определенном диапазоне дат.

Мне потребовалось некоторое время, чтобы выяснить, как сделать совпадение типа <= вместо совпадения на равенство:

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, который выполняется, является: </p>

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

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

Я уверен, что упускаю что-то очевидное. Может кто-то здесь указать мне?

Ответы [ 2 ]

5 голосов
/ 11 марта 2010

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

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

Редактировать: Упс, нервный разум. Это делает ИЛИ, в отличие от И.

Похоже, правильный способ сделать это - предоставить хэш-ссылку для одного status_date:

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

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

1 голос
/ 01 мая 2012

В SQL и в DBIx :: Class BETWEEN поддерживается:

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