CakePHP が適切に「引用」しなかったことに少し驚いたので、私はあなたの状況をテストしました。
Table.expire <
に
`Table`.`expire` <
(通常はそうします)。
これは、「NOW()」を「値」プロパティとして$this->getDataSource()->expression('NOW()')
返すという事実に関連している可能性があります。stdObject
おそらく、これは CakePHP のロジックの「特別な」ケースですが、よくわかりません。
配列表記は、「式」ではなく「リテラル」値を想定しています
とにかく、一般に、「配列表記」は、渡された値を式ではなく「リテラル」値と見なすため、そのように引用します。
'conditions' => array('Table.expire <' => 'some value')
'conditions' => array('Table.expire < ?' => 'another value')
'conditions' => array('Table.expire <' => 'NOW()')
すべて「リテラル」値と見なされるため、これらの SQL 条件が発生します。
WHERE `Table`.`expire` < 'some value'
WHERE `Table`.`expire` < 'another value'
WHERE `Table`.`expire` < 'NOW()'
したがって、値は文字列と見なされ、「NOW()」はデータベースから「現在の日付/時刻」として認識されません。
オプション
これにより、いくつかのオプションが残ります。
キー/値の配列ではなく、文字列として条件を指定します
質問でこのオプションをすでに提供しています:
'conditions' => array('Table.expire < NOW()')
このソリューションは、あなたの状況では安全であるはずです (ステートメントにユーザー入力が含まれていない) が、ユーザー入力がそのようなステートメントに含まれる場合は、適切にサニタイズする必要があります。また、NOW()
有効なクロスデータベースではない場合があります (ANSI SQL はCURRENT_TIMESTAMP
現在の日付/時刻を使用します)。
現在の日付/時刻を「式」ではなく ISO 日付として指定します
これは私が通常使用するアプローチです。配列表記を好む場合は、条件に「リテラル」日付を、できればほとんどのデータベースで適切に処理される ISO 日付として提供することを検討してください。
'conditions' => array('Table.expire <' => date('Y-m-d H:i:s'))
// or
'conditions' => array('Table.expire < ?' => date('Y-m-d H:i:s'))
の「条件」キーとして使用するすべての例を作成したことに注意find()
してください。ただし、同じことが a に適用されますdeleteAll()
お役に立てれば!