如何从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()'));
答案 0 :(得分:1)
试试这个
$this->delete("all", array('conditions'=>array(
'Table.expire < ' => $this->getDataSource()->expression('NOW()')))
);
答案 1 :(得分:1)
我已经测试了你的情况,因为我有点惊讶CakePHP没有正确'引用'
Table.expire <
到
`Table`.`expire` <
(通常情况下)。
此可能与$this->getDataSource()->expression('NOW()')
以'NOW()'作为'value'属性返回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日期,大多数数据库都能正确处理;
'conditions' => array('Table.expire <' => date('Y-m-d H:i:s'))
// or
'conditions' => array('Table.expire < ?' => date('Y-m-d H:i:s'))
注意我已创建了所有示例,以用作find()
的“条件”键,但同样适用于deleteAll()
希望这有帮助!