Laravel查询生成器-使用行中的数据与另一个中的时间进行比较

时间:2019-04-17 13:11:22

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

我使用whereRaw进行了以下操作:

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

该表中包含许多报告,时间表不同。即我希望每15分钟检查一份报告,每60分钟检查另一份报告。如果last_check_datetime中的时间不超过check_schedule_minutes中的分钟数,则报告不应在集合中返回。

是否有一种方法可以使用更为口才的语法(理想情况下使用Carbon)来实现同一目的?

2 个答案:

答案 0 :(得分:1)

我想你在这里做什么是对的。问题出在您的问题中-您想合并PHP / MySQL语法,但是数据在MySQL中。因此,在没有先获取所有记录然后进行检查的情况下,您所做的是正确的,而且并不是真正可以避免的。但是,如果您真的想要更出色的构建解决方案,请点击此处:

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

不过,我认为whereRaw更整洁。

答案 1 :(得分:0)

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

Reports::whereBetween('last_check_datetime', [Carbon::now()->subMinutes($check_schedule_minutes), Carbon::now()])->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();