1

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

我想从现在()中删除过期时间小于 1 小时的所有行。我不想使用 date() 等 PHP 函数,因为我的 PHP 服务器时区和 MYsql 服务器时区不同。此外,我的会话令牌在 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 日期函数计算

4

1 回答 1

1

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

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

请注意,这样做不会引用表/字段名。

另请注意,如果您没有将$cascade 指定为 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'
);
于 2013-06-27T14:05:44.637 回答