CakePHP条件比较数据库字段与mysql格式

时间:2013-06-27 13:55:04

标签: mysql cakephp

在CakePHP中编写代码时遇到了问题。

我想从现在开始删除过期时间少于1小时的所有行()。 我不想使用像date()等PHP函数,因为我的PHP服务器时区和MYsql Server时区不同。此外,我的会话令牌在30秒后到期,因此如果两台服务器都没有与实时同步,我就无法承受时差错误。

我写下了这段代码

$this->deleteAll(array('SESSION_TRANSFER.EXPIRE_TIME <' =>
DboSource::expression('CURRENT_TIMESTAMP - INTERVAL 1 MINUTE')));

我的期望是

SELECT `SESSION_TRANSFER`.`SESS_TRANS_ID`
FROM `DISE`.`T_SESSION_TRANSFER` AS `SESSION_TRANSFER`
WHERE `SESSION_TRANSFER`.`EXPIRE_TIME` <
CURRENT_TIMESTAMP - INTERVAL 1
MINUTE
LIMIT 0 , 30

但它正在产生错误

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 
'SESSION_TRANSFER.EXPIRE_TIME <' in 'where clause'

SQL Query: SELECT `SESSION_TRANSFER`.`SESS_TRANS_ID` 
FROM `DISE`.`T_SESSION_TRANSFER` AS `SESSION_TRANSFER` 
WHERE `SESSION_TRANSFER.EXPIRE_TIME <` = CURRENT_TIMESTAMP - INTERVAL 1 hour 

我也试过这个

$this->deleteAll(array('SESSION_TRANSFER.EXPIRE_TIME <'
=> 'CURRENT_TIMESTAMP - INTERVAL 1 MINUTE '));

查询不符合预期

SELECT `SESSION_TRANSFER`.`SESS_TRANS_ID` 
FROM `DISE`.`T_SESSION_TRANSFER` AS `SESSION_TRANSFER` 
WHERE `SESSION_TRANSFER`.`EXPIRE_TIME` < 'CURRENT_TIMESTAMP - INTERVAL 1 MINUTE '

有什么建议吗?我不想使用PHP日期函数计算

1 个答案:

答案 0 :(得分:1)

将整个sql表达式放在表达式对象中:

$this->deleteAll(
    DboSource::expression('SESSION_TRANSFER.EXPIRE_TIME < CURRENT_TIMESTAMP - INTERVAL 1 MINUTE')
);

请注意,执行此操作时,不会有表/字段引用。

另请注意,如果您未指定$cascade as false,Cake将执行一次选择并一次删除一行。发布单个查询可能更合适:

$this->deleteAll(
    DboSource::expression('SESSION_TRANSFER.EXPIRE_TIME < CURRENT_TIMESTAMP - INTERVAL 1 MINUTE'),
    false // <-
);

或者因为那是一个没有变量的查询,你也可以使用查询:

$this->query(
    'DELETE FROM T_SESSION_TRANSFER WHERE T_SESSION_TRANSFER.EXPIRE_TIME < CURRENT_TIMESTAMP - INTERVAL 1 MINUTE'
);