【发布时间】:2014-09-09 13:39:50
【问题描述】:
我正在尝试让我的 cron 仅获得 Projects ,这些 Projects 将在接下来的 7 天内重复/续订以发送提醒电子邮件。我刚刚发现我的逻辑不太行。
我目前有查询:
$projects = Project::where(function($q){
$q->where('recur_at', '>', date("Y-m-d H:i:s", time() - 604800));
$q->where('status', '<', 5);
$q->where('recur_cancelled', '=', 0);
});
但是,我意识到我需要做的是:
伪 SQL:
SELECT * FROM projects WHERE recur_at > recur_at - '7 days' AND /* Other status + recurr_cancelled stuff) */
我将如何在 Laravel 4 中执行此操作,并且使用 DATETIME 数据类型,我只使用时间戳完成了这种事情。
更新:
在使用以下代码后设法解决了这个问题,当您可以提取一些代码并脱离上下文查看它们时,Stackoverflow 也有帮助。
$projects = Project::where(function($q){
$q->where(DB::raw('recur_at BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()'));
$q->where('status', '<', 5);
$q->where('recur_cancelled', '=', 0);
});
更新问题:在 Laravel/Eloquent 中是否有更好的方法来做到这一点?
更新 2:
第一个解决方案在进一步测试后结果不正确,我现在解决并测试了以下解决方案:
$projects = Project::where(function($q){
$q->where('recur_at', '<=', Carbon::now()->addWeek());
$q->where('recur_at', '!=', "0000-00-00 00:00:00");
$q->where('status', '<', 5);
$q->where('recur_cancelled', '=', 0);
});
【问题讨论】:
-
据我所知,您必须使用
DB::raw,所以没有其他方法可以单独使用 Eloquent。另一方面,您为什么使用 DATETIME 而不是 TIMESTAMP 列?我要问的问题与原始问题无关,但与 DATETIME 相比,TIMESTAMP 更适合许多用例。 -
@N.B. DATETIME 似乎是 Laravel 使用的“标准”时间字段,所以我一直使用它。
-
你可以使用 whereRaw(sql) 代替 where(DB::raw(sql))
-
@MrShibby 我想我有点喜欢
where(DB::raw())格式,因为它看起来更清晰一些。whereRaw()更好有什么技术原因吗? -
@Jono20201 - 不,这不是标准时间字段。标准时间字段是并且始终是
TIMESTAMP。原因是 TIMESTAMP 始终采用 UTC,使用 DATETIME 您应该知道它来自哪个时区,以便您可以为其他时区的用户执行时间转换。甚至 Eloquent 也使用时间戳类型而不是日期时间。两种类型都向您显示完全相同的格式化日期,因此我强烈建议您使用时间戳而不是日期时间。
标签: php mysql laravel eloquent datetime-format