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

时间:2014-07-18 12:05:52

标签: php mysql laravel eloquent datetime-format

我正在努力让我的cron只能在接下来的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数据类型,我只使用时间戳完成此类操作。

更新

使用以下代码管理解决此问题后,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);
});

4 个答案:

答案 0 :(得分:58)

您可以直接链接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;)它应该可以工作。

编辑: 作为Joel said,你可以这样做:

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

答案 1 :(得分:12)

不想搞砸碳。所以这是我的解决方案

$start = new \DateTime('now');
$start->modify('first day of this month');
$end = new \DateTime('now');
$end->modify('last day of this month');

$new_releases = Game::whereBetween('release', array($start, $end))->get();

答案 2 :(得分:3)

@Tom:而不是现在使用&#39;或者&#39; addWeek&#39;如果我们以下列格式提供日期,则不会提供正确的记录

$projects = Project::whereBetween('recur_at', array(new DateTime('2015-10-16'), new DateTime('2015-10-23')))
->where('status', '<', 5)
->where('recur_cancelled', '=', 0)
->get();

它提供的日期为2015-10-16的记录小于2015-10-23。 如果recur_at的值为 2015-10-23 00:00:00 ,则仅显示该记录 否则如果 2015-10-23 12:00:45 那么就不会显示

答案 3 :(得分:-1)

编辑:请注意,whereBetween('date',$start_date,$end_date)
包括第一次约会。