Laravel $ q-> where()之间的date

我正在试图让我的cron只接收将在未来7天内重复/续订的Projects ,发送提醒电子邮件。 我刚刚发现我的逻辑不起作用。

我目前有这个查询:

 $projects = Project::where(function($q){ $q->where('recur_at', '>', date("Ymd 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数据types,我只使用时间戳做这种事情。

更新:

在使用下面的代码之后,使用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); }); 

更新问题:在Laravel /雄辩中有更好的方法吗?

更新2:

经过进一步的testing,第一个分辨率结果不对,现在我已经解决并testing了以下解决scheme:

 $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) 。 在laravel还有一个不错的date处理软件包,叫做Carbon 。 所以你可以做这样的事情:

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

只要确定你在composer php中需要碳,并且使用碳命名空间(使用Carbon \ Carbon;),它应该可以工作。

编辑:正如乔尔所说 ,你可以这样做:

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

不想沾染碳。 所以这是我的解决scheme

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

@Tom:如果我们提供以下格式的date,而不是使用'now'或'addWeek',它不会给出正确的logging

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

它提供的dateforms2015-10-16的loggingless于2015-10-23。 如果recur_at的值是2015-10-23 00:00:00那么只有它显示该logging否则如果是2015-10-23 12:00:45 则不显示

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