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

Php Laravel$q->;日期之间的where(),php,mysql,laravel,eloquent,datetime-format,Php,Mysql,Laravel,Eloquent,Datetime Format,我正试图让我的cron只获取在未来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_cancell

我正试图让我的cron只获取在未来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);
});
在Laravel4中我将如何做到这一点,并且使用DATETIME数据类型,我只使用时间戳做过这类事情

更新:

在使用下面的代码后,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);
});
$projects=Project::where(函数($q){
$q->where(DB::raw('recurr_在DATE_SUB(NOW(),INTERVAL 7 DAY)和NOW()');

$q->where('status','您可以直接将
链接到where
s,而无需
函数(q)
。laravel中还有一个很好的日期处理包,名为。因此您可以执行以下操作:

$projects = Project::where('recur_at', '>', Carbon::now())
    ->where('recur_at', '<', Carbon::now()->addWeek())
    ->where('status', '<', 5)
    ->where('recur_cancelled', '=', 0)
    ->get();
$projects=Project::where('recurr_at','>',Carbon::now())
->其中('recurr\u at','addWeek()))

->其中('status',“不想与碳混为一谈。因此,我的解决方案如下

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

编辑:请注意,
其中('date'、$start\u date、$end\u date)

包括第一个日期。

@Tom:如果我们以以下格式提供日期,则不使用'now'或'addWeek',它不会给出正确的记录

$projects = Project::whereBetween('recur_at', array(new DateTime('2015-10-16'), new DateTime('2015-10-23')))
->where('status', '<', 5)
->where('recur_cancelled', '=', 0)
->get();
$projects=Project::whereween('recurr_at',数组(新日期时间('2015-10-16')、新日期时间('2015-10-23'))

->在哪里(‘status’,‘据我所知,您必须使用
DB::raw
,所以不,没有其他方法可以单独使用Eloquent。另一方面,您为什么要使用DATETIME而不是TIMESTAMP列?我问的与原始问题无关,但时间戳在许多用例中比DATETIME更适合。@N.B.DATETIME似乎作为Laravel使用的“标准”时间域,所以我保留了它。您可以使用where(DB::raw(sql))而不是where(DB::raw(sql))@MrShibby,我想我有点喜欢
where(DB::raw())
格式,因为它看起来更清晰。有什么技术原因导致
whereRaw()
更好吗?@Jono20201-不,它不是标准时间域。标准时间域是,并且永远是一个
时间戳
。原因是时间戳总是以UTC为单位,其中DATETIME应该知道它来自哪个时区,这样你就可以为位于其他时区的用户执行时间转换ses timestamp类型而不是datetime。这两种类型都显示完全相同的格式化日期,因此我强烈建议您使用timestamp而不是datetime。看起来不错,但只是提醒您不需要双where子句,您可以使用WHERETHE来代替。@JoelHinz Nice!将来肯定会使用它。快速查看api A多亏了你,我发现还有一个或介于两者之间等等……我通过使用
$q->where('recuru at','哦,现在我看到我给出了过去的日期,你希望接下来的一周,很抱歉,但你有重点:)我编辑了这本书answer@Tom太好了,勾选你的答案。我花了几分钟时间和我的业务伙伴算出了数学公式,使用碳元素使它更简单。不是真的。你可能看到的是日期时间不准确。只需执行
$startDate->startOfDay();
$endDate->endOfDay()
否则它默认为现在的任何时间。这是一个很好的解决方案。但请注意,Carbon是DateTime类的扩展。如果在解决方案中将
DateTime
替换为
Carbon
,则结果完全相同。
$projects = Project::whereBetween('recur_at', array(Carbon::now(), Carbon::now()->addWeek()))
    ->where('status', '<', 5)
    ->where('recur_cancelled', '=', 0)
    ->get();
$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();
$projects = Project::whereBetween('recur_at', array(new DateTime('2015-10-16'), new DateTime('2015-10-23')))
->where('status', '<', 5)
->where('recur_cancelled', '=', 0)
->get();