我使用whereRaw进行了以下操作:
Reports::whereRaw('last_check_datetime < CURRENT_TIMESTAMP - INTERVAL `check_schedule_minutes` MINUTE')->get();
该表中包含许多报告,时间表不同。即我希望每15分钟检查一份报告,每60分钟检查另一份报告。如果last_check_datetime
中的时间不超过check_schedule_minutes
中的分钟数,则报告不应在集合中返回。
是否有一种方法可以使用更为口才的语法(理想情况下使用Carbon)来实现同一目的?
答案 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();