2013-06-27 4 views
1

При написании кода в CakePHP возникла проблема.CakePHP Состояние сравнения поля базы данных с формой mysql

Я хотел удалить все строки, срок действия которых меньше 1 часа(). Я не хочу использовать функцию PHP, такую ​​как date() и т. Д., Поскольку мой часовой пояс 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

ответ

1

Положите все выражение SQL в объекте выражения:

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

Имейте в виде, что делать это, не будет никакой таблицы/имя_поля не процитировать.

Обратите внимание, что если вы не укажете $cascade as false, то будет выполнять выбор и удаление каждой строки по одному. Это, вероятно, более целесообразно выдавать один запрос:

$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' 
); 
+0

Вы просто здорово это решение решить мою проблему каскадный слишком. Большое спасибо! –