6

私はDBIx::Classに足を踏み入れています — これまでのところ気に入っています。

私が直面している問題の 1 つは、特定の日付範囲にないレコードを除外して、レコードをクエリしたいということです。

<=等価一致の代わりに特定の種類の一致を行う方法を見つけるのにしばらく時間がかかりました。

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 つの条件を適用する方法がわかりませんでした。私が見つけたすべてのドキュメントは、複数の列でフィルタリングする方法を示していますが、同じ列で2つの条件は示していません。

明らかな何かが欠けていると確信しています。ここで誰かが私にそれを指摘できますか?

4

2 に答える 2

5

IIRC を使用すると、複数の検索条件の配列参照を渡すことができるはずです (それぞれ独自の hashref で)。例:

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

編集:おっと、神経質。これは、AND ではなく OR になります。

それを行う正しい方法は、単一のハッシュリファレンスを提供することですstatus_date

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

この内容は、DBIC が内部で使用するSQL::Abstractで文書化されています。

于 2010-03-11T17:35:48.563 に答える
1

SQLとBETWEENDBIx::Class でサポートされています:

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