【问题标题】:Laravel query builder - using data within row to compare with time in anotherLaravel 查询构建器 - 使用行中的数据与另一个中的时间进行比较
【发布时间】:2019-09-07 17:56:18
【问题描述】:

我使用 whereRaw 完成了这项工作,如下所示:

Reports::whereRaw('last_check_datetime < CURRENT_TIMESTAMP - INTERVAL `check_schedule_minutes` MINUTE')->get();

该表中有许多报告,具有不同的计划分钟数。即我希望每 15 分钟检查一次报告,每 60 分钟检查一次报告。如果last_check_datetime 中的时间不早于check_schedule_minutes 中的分钟数,则不应在集合中返回报告。

有没有办法使用更雄辩的语法来实现同样的目标,最好是使用 Carbon?

【问题讨论】:

    标签: laravel eloquent query-builder laravel-query-builder


    【解决方案1】:

    您可以在日期列上使用 eloquent 的 whereBetween 方法

    Reports::whereBetween('last_check_datetime', [Carbon::now()-&gt;subMinutes($check_schedule_minutes), Carbon::now()])-&gt;get();

    应该为您解决问题。

    编辑:我意识到这取决于您在进行查询之前了解 $check_schedule_minutes 值,您的问题是从表中读取 check_schedule_minutes。 解决此问题的一种方法是为 check_schedule_minutes (如您所说的 15 或 60 分钟)设置一个预定义标准,然后将该值传递给执行查询的函数并将其添加到您的条件中:

    $check_schedule_minutes = 60;
    
    Reports::whereBetween('last_check_datetime', [Carbon::now()->subMinutes($check_schedule_minutes), Carbon::now()])
    ->where('check_schedule_minutes', $check_schedule_minutes)
    ->get();
    

    【讨论】:

    • 谢谢。 $check_schedule_minutes 实际上可以是从 15 分钟到一个月的任何时间,所以我真的需要一种方法来动态地从数据库的每一行中提取它
    【解决方案2】:

    Tbh 我认为你在这里做的是对的。问题出在你的问题上——你想要合并 PHP/MySQL 语法,但数据在 MySQL 中。因此,如果没有先获取所有记录然后进行检查,那么您所做的就是正确的,并且不是真正可以避免的。但是,如果你真的想要更雄辩的建筑解决方案,这里:

    Reports::where('last_check_datetime', '<', DB::raw('CURRENT_TIMESTAMP - INTERVAL `check_schedule_minutes` MINUTE'))->get();
    

    不过,我认为 whereRaw 更整洁。

    【讨论】:

    • 谢谢。我同意 - 我认为它真的很相似。我的目标是让 Carbon 助手进入查询,但这似乎是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    相关资源
    最近更新 更多