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

Jon*_*201 41 php mysql datetime-format laravel eloquent

我试图让我的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);
});
Run Code Online (Sandbox Code Playgroud)

但是,我意识到我需要做的是:

Psudo SQL:

SELECT * FROM projects WHERE recur_at > recur_at - '7 days' AND /* Other status + recurr_cancelled stuff) */
Run Code Online (Sandbox Code Playgroud)

我将如何在Laravel 4中执行此操作,并使用DATETIME数据类型,我只使用时间戳完成此类操作.

更新:

管理使用下面的代码后,解决这个问题,也#1时帮助你可以拉的码位看他们断章取义.

$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);
});
Run Code Online (Sandbox Code Playgroud)

更新的问题:在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);
});
Run Code Online (Sandbox Code Playgroud)

Tom*_*Tom 59

你可以where直接链接你的s,而不是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();
Run Code Online (Sandbox Code Playgroud)

只要确保你在作曲家中需要Carbon并且你正在使用Carbon命名空间(使用Carbon\Carbon;)它应该可以工作.

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

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

  • 看起来不错,但只是一个单挑,你不需要double where子句,你可以使用whereBetween代替. (9认同)

Edm*_*nok 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();
Run Code Online (Sandbox Code Playgroud)

  • 好的解决方案 请注意,Carbon是DateTime类的扩展.如果在解决方案中将`DateTime`替换为'Carbon`,结果将完全相同. (3认同)