如何在同一列上过滤具有2个条件的Perl DBIx记录集?

时间:2010-03-11 16:49:24

标签: perl dbix-class

我正在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个条件。

我确定我错过了一些明显的东西。有人可以在这指出我吗?

2 个答案:

答案 0 :(得分:5)

IIRC,你应该能够传递多个搜索条件的数组引用(每个条件都在自己的hashref中。)例如:

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]}});