Я намочил ноги в DBIx:: Класс — любовь его до сих пор.
Одна проблема, с которой я сталкиваюсь, состоит в том, что я хочу запросить записи, отфильтровывая записи, которые не находятся в определенном диапазоне дат.
Это взяло меня некоторое время, чтобы узнать, как сделать a <=
тип соответствия вместо соответствия равенства:
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 условия к тому же столбцу. Вся документация я смог найти шоу, как отфильтровать больше чем на 1 столбце, но не 2 условия на том же столбце.
Я уверен, что пропускаю что-то очевидное. Кто-то может здесь указать на это мне?
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 под капотом.