一尘不染

日期之间的Laravel $ q-> where()

mysql

我正试图让我的cron只收到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);
});

阅读 597

收藏
2020-05-17

共1个答案

一尘不染

您可以where直接链接,而无需function(q)。laravel中还有一个很好的日期处理程序包,叫做Carbon。因此,您可以执行以下操作:

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

只要确保您在作曲家中需要Carbon并使用Carbon名称空间(使用Carbon \ Carbon;),它就可以工作。

编辑:正如乔尔所说,您可以:

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