使用博客教程,我希望有一个选项,您可以在"主"索引页面上查看帖子,直到帖子活跃 x 天。在 x 天的这段时间之后,我希望帖子在数据库中设置为"过期"。谁能阐明实现这一目标的最佳方法?
如果使用分
页,请使用:
注意这里$x是你的内脏
$this->Post->recursive = 0;
$this->paginate = array(
'conditions' => array('DATEDIFF(CURDATE(), DATE(Post.created)) >' => $x)
);
$this->set('posts', $this->paginate());
对于普通的find(),请使用以下命令:
$this->Post->find('all',
array(
'conditions' => array('DATEDIFF(CURDATE(), DATE(Post.created)) >' => $x)
)
);
可能最好的方法是使用 SQL select 语句。 MySQL有许多内置的日期方法。 但首先,我们需要定义您要完成的目标。 另请注意,我们使用的字段(created_at
、allotted_time
)都是DATE
字段。
您要做的是仅显示当前正在运行的帖子。 由于我们知道广告的开始日期,因此我们可以从当前日期中减去开始日期,以确定距离广告过期还剩下多少时间。 这可以通过DATEDIFF
函数和CURDATE
函数来实现。
DATEDIFF(CURDATE(), `created_at`)
如果您尝试执行上述语句,您会注意到它返回一个整数,即自广告首次创建以来经过的天数。 由于DATEDIFF
返回一个整数,我们也需要将allotted_time
转换为整数。
DATEDIFF(`allotted_time`, `created_at`)
现在,我们知道广告已经投放了多少时间,以及广告创建之日后必须投放多少天。 显然,如果广告的投放时间少于创建日期与分配时间之间的天数,则该广告仍在投放。
WHERE DATEDIFF(CURDATE(), `created_at`) < DATEDIFF(`allotted_time`, `created_at`)
把这些放在一起,我们得到一个类似的陈述。
SELECT `id`
FROM `ads`
WHERE
DATEDIFF(CURDATE(), `created_at`) < DATEDIFF(`allotted_time`, `created_at`)