0

CakePHPからこのステートメントを正しく生成する方法は?

DELETE FROM table as Table WHERE Table.expire < NOW();

私はこれを試しましたが、これは機能していません:

$this->deleteAll(array(
    'Table.expire <' => $this->getDataSource()->expression('NOW()')
));

//It complains:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Table.expire <' in 'where clause'

SQL Query: 
SELECT `Table`.`id` FROM `database`.`table` AS `Table`   WHERE `Table.expire <` = NOW()

現在それを機能させる唯一の方法は、条件全体を文字列として作成することです。

$this->deleteAll('Table.expire < NOW()');
:: OR ::
$this->deleteAll(array('Table.expire < NOW()'));
4

2 に答える 2

1

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()

お役に立てれば!

于 2013-03-22T21:17:16.187 に答える
1

これを試して

$this->delete("all", array('conditions'=>array(
    'Table.expire < ' => $this->getDataSource()->expression('NOW()')))
    );
于 2013-03-22T07:59:35.953 に答える