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)
包括第一次约会。