我正试图让我的cron在future 7天内只收到Projects封将再次出现/续费的邮件,以发送提醒邮件.我刚刚发现我的逻辑不太正确.

我目前有一个疑问:

$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);
});

然而,我意识到我需要做的是:

Psudo SQL:

SELECT * FROM projects WHERE recur_at > recur_at - '7 days' AND /* Other status + recurr_cancelled stuff) */

在Laravel 4中,我应该如何做到这一点,并且使用DATETIME数据类型,我只使用时间戳做过这类事情.

Update:

在使用下面的代码后,Stackoverflow成功地解决了这个问题,当您可以从上下文中提取代码位并查看它们时,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);
});

Updated Question:在Laravel/Eloquent中有更好的方法吗?

Update 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);
});

推荐答案

你可以直接链住你的where,而不是function(q).在拉维尔还有一个不错的约会处理软件包,叫做Carbon.所以你可以这样做:

$projects = Project::where('recur_at', '>', Carbon::now())
    ->where('recur_at', '<', Carbon::now()->addWeek())
    ->where('status', '<', 5)
    ->where('recur_cancelled', '=', 0)
    ->get();

只需确保在composer中需要Carbon,并且使用Carbon名称空间(使用Carbon\Carbon;)它应该会起作用.

编辑:

$projects = Project::whereBetween('recur_at', array(Carbon::now(), Carbon::now()->addWeek()))
    ->where('status', '<', 5)
    ->where('recur_cancelled', '=', 0)
    ->get();

Mysql相关问答推荐

从MySQL JSON列中检索数组中的所有答案

如何创建一个列,该列在另一个表中具有值的计数?

将 Cloud Function (nodejs) 连接到 CloudSQL mySQL 数据库

关于设置为 NOT NULL 时的 CHAR 默认值

是否可以使用以EXPLAIN EXTENDED ...开头的 SQL 语句修改数据?

将 AVG 与 HAVING 结合使用

MySQL,递归 CTE.它如何以这种句法形式工作?

按年份范围 SQL 查询分组

从 2 个不同的表中获取数据并将它们加入 sql

用数字和字母对 VARCHAR 列进行排序

MySQL 查询组按日期(12 小时间隔)

MySQL按连续值和计数分组

mysql从另一个表中 Select 不相等的值

不是唯一的表/别名

PDO:MySQL 服务器已消失

从mysql中的大表中快速 Select 随机行

SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合

在 Mac 上设置 Laravel php artisan migrate 错误:没有这样的文件或目录

将行插入 MySQL 数据库的最有效方法

当运行 UPDATE ... datetime = NOW();所有更新的行都会有相同的日期/时间吗?