我正在CakePHP 2.4.7中开发一个应用程序
我有我的MySQL数据库,当系统的日期和小时与表格中的截止日期匹配时,我发现需要触发更新。
我正在使用的表格如下
CREATE TABLE applied_surveys (id CHAR(36) NOT NULL PRIMARY KEY,
display_name VARCHAR(200),
area_id CHAR(36) NOT NULL,
survey_id CHAR(36) NOT NULL,
system_user_id CHAR(36) NOT NULL,
code VARCHAR(50),
init_date DATE,
due_date DATE,
init_hour TIME,
due_hour TIME,
completed INT,
state TINYINT DEFAULT 1,
max_responders INT,
created DATE, modified DATE,
FOREIGN KEY (area_id) REFERENCES areas(id),
FOREIGN KEY (survey_id) REFERENCES surveys(id),
FOREIGN KEY (system_user_id) REFERENCES system_users(id));
如您所见,我正在使用初始日期/小时和截止日期/小时。我的意图是我添加一项调查,并设定截止日期。达到截止日期和小时后,系统必须将状态(状态)值更改为0,表示调查已关闭。
我正在将这个数据库集成到CakePHP应用程序中,但我不确定在哪种情况下我应该为这种情况编写逻辑。
答案 0 :(得分:1)
您不一定需要更新列,只需在查询表时返回当前系统日期和时间与due_date和due_time的比较。
将due_date和due_hour分成两个单独的列似乎有点奇怪,如果我们假设它们都不为null,我们可以将它们转换为DATETIME,然后比较NOW()
e.g。
SELECT NOW() <= CONCAT(s.due_date,' ',s.due_hour) AS `state`
FROM applied_surveys s
修改行时会触发MySQL行触发器。当系统时钟前进时,MySQL触发器不会被触发。
您可以运行UPDATE语句,以便在需要时标识要更新的行,例如
UPDATE applied_surveys s
SET s.state = 0
WHERE NOW() >= CONCAT(s.due_date,' ',s.due_hour)
AND NOT (s.state <=> 0)
答案 1 :(得分:0)
你不能写“sistem”,它是系统。
您需要每秒/分钟/小时运行一个cron作业,或者您喜欢的任何内容,这将检查每条记录,并查看哪些记录稍后而不是系统日期。您不能指望它在日期完全相同时正好运行,特别是如果您考虑秒数。
您可以在此处阅读有关CRON职位的信息:http://code.tutsplus.com/tutorials/managing-cron-jobs-with-php--net-19428
答案 2 :(得分:0)
您可以使用事件而不是触发器。
仅在直接调用存储过程时才执行它;当与表关联的事件(例如插入,更新或删除事件)发生时,可以一次或多次定期执行该事件。
设置事件 SET GLOBAL event_scheduler = ON;
CREATE EVENT IF NOT EXISTS update_state
ON SCHEDULE EVERY 1 day
DO
Update applied_surveys
Set state= 0
where due_date < curdate();
//similar condition can be added for hour.
查看架构中的所有事件
SHOW EVENTS;