如何使用带有'<'的表达式和'>'在CakePHP模型中

时间:2013-03-22 07:37:28

标签: cakephp

如何从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()'));

2 个答案:

答案 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()”视为“当前日期/时间”。

选项

这会给你一些选择;

将条件指定为String,而不是键/值数组

您已在问题中提供此选项:

'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()的“条件”键,但同样适用于deleteAll()

希望这有帮助!