我正在DBIx::Class弄湿我的脚 - 到目前为止爱它。
我遇到的一个问题是我想查询记录,过滤掉不在特定日期范围内的记录。
我花了一些时间来了解如何进行<=
类型的匹配而不是相等匹配:
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&lt; = $ end_date的位置。执行的SQL是:
SELECT me.* from MyTable me where status_date <= '9999-12-31'
我搜索了CPAN,Google和SO,并且无法弄清楚如何将2个条件应用于同一列。我能够找到的所有文档都显示了如何在同一列上过滤超过1列而不是2个条件。
我确定我错过了一些明显的东西。有人可以在这指出我吗?
答案 0 :(得分:5)
my $result = $schema->resultset('MyTable')->search(
[ { 'status_date' => \$start_criteria },
{ 'status_date' => \$end_criteria },
]
);
编辑:哎呀,神经迷茫。这是一个OR,而不是AND。
看起来正确的做法是为单个status_date
提供hashref:
my $result = $schema->resultset('MyTable')->search(
{ status_date => { '>=' => $start_date, '<=' => $end_date } }
);
这些内容记录在SQL::Abstract中,DBIC在幕后使用。
答案 1 :(得分:1)
SQL中有BETWEEN
,支持DBIx :: Class:
my $result = $schema->resultset('MyTable')
->search({status_date => {between => [$start_date,$end_date]}});