6

我在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 <= $end_date的位置。被执行的 SQL 是:

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

我搜索了 CPAN、Google 和 SO,但无法弄清楚如何将 2 个条件应用于同一列。我能够找到的所有文档都显示了如何过滤超过 1 列,但不是同一列上的 2 个条件。

我确定我遗漏了一些明显的东西。这里有人可以向我指出吗?

4

2 回答 2

5

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

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

编辑:哎呀,神经。那是 OR,而不是 AND。

看起来正确的方法是为单个提供 hashref status_date

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

这些东西记录在SQL::Abstract中,DBIC 在后台使用它。

于 2010-03-11T17:35:48.563 回答
1

SQL 和DBIx BETWEEN::Class 支持它:

my $result = $schema->resultset('MyTable')
   ->search({status_date => {between => [$start_date,$end_date]}});
于 2012-05-01T07:55:21.843 回答