在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日期函数计算
答案 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'
);