Laravel $q->where()

2022-08-30 11:10:38

我试图让我的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);
});

答案 1

您可以直接链接您的 s,而无需 .在laravel中还有一个很好的日期处理包,叫做Carbon。所以你可以做这样的事情:wherefunction(q)

$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;)它应该工作。

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

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

答案 2

不想弄乱碳。所以这是我的解决方案

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

推荐