2017-12-20 53 views
2

24時間前に作成されたすべてのレコードを取得しようとしています。ここでは、 '作成された'はデータタイムフィールドです。私はこの条件を満たす必要がありますが、0レコードを返すDBの3つのレコードを持っています。cakephp 3.x日時フィールドの比較で正しい結果が返されない

$my_table_tbl = TableRegistry::get('my_table'); 
$records = $my_table_tbl 
    ->find() 
    ->where([ 
     'created <' => '(NOW() - INTERVAL 1 DAY)', 
     'status' => 'pending' 
    ]) 
    ->toArray(); 

答えて

1

CakePHPは、常に句の右側を変数バインディングとして扱います。つまり、(NOW() - INTERVAL 1 DAY)は文字列値として解釈されます。

クエリを文字列に変換することで、生成されるSQLを確認できます。

上記のSQLを出力すると、式の代わりにcreated < :c0が表示されます。

カスタムオブジェクトを作成するには、クエリオブジェクトを使用します。

$q = $my_table_tbl->query(); 
$query = $my_table_tbl 
    ->find() 
    ->where([ 
     'created <' => $q->newExp('(NOW() - INTERVAL 1 DAY)'), 
     'status' => 'pending' 
    ]); 
dd((string)$query); 

上記のSQLを出力すると、期待通りにcreated < (NOW() - INTERVAL 1 DAY)が表示されます。これは、CakePHPが右手の値が式オブジェクトであるかどうかをチェックするためです。

+1

完全性のために、[** 'FunctionsBuilder :: dateAdd()' **](https://api.cakephp.org/3.5/class-Cake.Database.FunctionsBuilder.html#_dateAdd)もあります。クロススキーマ互換SQLの生成をサポートしています。 – ndm

+0

@cgtagそれは私のために働いた、多くのありがとう。 ** newExpr()** - Row Expressionを作成するメソッドが魔法をしました。 –

関連する問題