gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:29:22 26 4
gpt4 key购买 nike

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

我想删除所有过期时间距 now() 不到 1 小时的行。我不想使用 date() 等 PHP 函数,因为我的 PHP 服务器时区和 MYsql 服务器时区不同。此外,我的 session token 在 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 日期函数计算

最佳答案

将整个 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'
);

关于mysql - CakePHP 条件比较数据库字段与 mysql 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17345143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com