Sql 基于数据库中值的条件的Laravel where子句

Sql 基于数据库中值的条件的Laravel where子句,sql,laravel,Sql,Laravel,我正在建立一个事件提醒页面,人们可以在其中设置特定事件的提醒。用户可以选择设置需要通知的时间量。它存储在通知时间和通知单元中notification\u time跟踪他们想要得到通知之前的时间,notification\u unit跟踪他们选择时间的PHP日期格式,例如i分钟,H小时 例如,notification\u time-2和notification\u unit-H意味着需要在2小时前通知他们 我在后台运行Cron作业来处理通知。此函数每分钟被点击一次 Reminder::where(

我正在建立一个事件提醒页面,人们可以在其中设置特定事件的提醒。用户可以选择设置需要通知的时间量。它存储在
通知时间
通知单元
notification\u time
跟踪他们想要得到通知之前的时间,
notification\u unit
跟踪他们选择时间的PHP日期格式,例如
i
分钟,
H
小时

例如,
notification\u time
-2和
notification\u unit
-
H
意味着需要在2小时前通知他们

我在后台运行Cron作业来处理通知。此函数每分钟被点击一次

Reminder::where(function ($query) {
    $query->where('event_time', '>=', now()->subMinutes(Carbon::createFromFormat('i', 60)->diffInMinutes() - 1)->format('H:i:s'));
    $query->where('event_time', '<=', now()->subMinutes(Carbon::createFromFormat('i', 60)->diffInMinutes())->format('H:i:s'));
})
提醒::where(函数($query){
$query->where('event_time','>=',now()->subMinutes(Carbon::createFromFormat('i',60)->diffInMinutes()-1)->format('H:i:s');

$query->where('event_time','无法直接回答此问题。我找到了两种解决问题的方法

第一种解决方案
Mysql有
DATEDIFF
DATE\u SUB
来获得时间戳差,并从时间戳中减去某些间隔。在我的情况下,函数每分钟运行一次。要使用它们,我必须重构数据库,在数据库中以秒为单位存储
时间和
单位。然后进行计算。我选择不使用它们这样做是因为这两个操作在服务器端都有点繁重,因为我每分钟都在运行这个函数

Reminder::where(function ($query) {
    $query->where('event_time', '>=', now()->subMinutes(Carbon::createFromFormat('i', 60)->diffInMinutes() - 1)->format('H:i:s'));
    $query->where('event_time', '<=', now()->subMinutes(Carbon::createFromFormat('i', 60)->diffInMinutes())->format('H:i:s'));
})
第二种解决方案
这是我个人在我的案例中所做的解决方案。在这里,我在将其存储在数据库中的同时进行了计算。意思是?让我解释一下。我创建了一个新表
notification\u settings
,该表链接到提醒(一对一关系)。该表如下所示

id
单位
时间
通知时间
重复
创建时间
更新时间


unit
time
列仅在显示提醒时使用。我所做的是,我在
notify\u at
列中计算何时收到通知。因此,在事件计划程序中,我现在需要检查提醒(因为我每分钟都在运行它)“重复”列用于跟踪提醒是否重复。如果重复,我会在计划时重新计算“通知”列。一旦用户收到通知,则“通知”列设置为空。

无法直接回答此问题。我找到了两种解决问题的方法问题

第一种解决方案
Mysql有
DATEDIFF
DATE\u SUB
来获得时间戳差,并从时间戳中减去某些间隔。在我的情况下,函数每分钟运行一次。要使用它们,我必须重构数据库,在数据库中以秒为单位存储
时间和
单位。然后进行计算。我选择不使用它们这样做是因为这两个操作在服务器端都有点繁重,因为我每分钟都在运行这个函数

Reminder::where(function ($query) {
    $query->where('event_time', '>=', now()->subMinutes(Carbon::createFromFormat('i', 60)->diffInMinutes() - 1)->format('H:i:s'));
    $query->where('event_time', '<=', now()->subMinutes(Carbon::createFromFormat('i', 60)->diffInMinutes())->format('H:i:s'));
})
第二种解决方案
这是我个人在我的案例中所做的解决方案。在这里,我在将其存储在数据库中的同时进行了计算。意思是?让我解释一下。我创建了一个新表
notification\u settings
,该表链接到提醒(一对一关系)。该表如下所示

id
单位
时间
通知时间
重复
创建时间
更新时间


unit
time
列仅在显示提醒时使用。我所做的是,我在
notify\u at
列中计算何时收到通知。因此,在事件计划程序中,我现在需要检查提醒(因为我每分钟都在运行它)。存在
repeating
列以跟踪提醒是否重复。如果是重复的,我会在计划时重新计算
notify_at
列。一旦用户收到通知
notify_at
设置为空。

任何原因都不能只存储
notify_at
列,并带有日期时间什么时候他们想要得到通知?你可以在记录创建时存储,而不是存储时间和单位。我认为你把它复杂化了。我不知道有什么方法可以在SQL中实现(我相信你可以),而Laravel解决方案将涉及加载所有记录、解析时间,然后过滤掉不对齐的记录,这是一个非常强大的功能。@Timleis需求远比这复杂,提醒可以是每年重复一次的类型,因此将特定日期存储为
notify_at
完全不符合逻辑。Loading所有记录都是海量的,因为函数每分钟都在运行。想象一下,有一个数据库包含10k+条记录。哦,我的案例也有6个表用于相同的内容。这个响应很有意义:)我只是问是否可以使用静态列,而不是试图通过编程创建它。不幸的是,我仍然没有一个方法,但我会关注这个问题;似乎很有趣。你的问题很有趣。我会尝试把事情搞混。一个表用于提醒和你的实际配置,另一个通知表。第二个表应预先计算
notify_at
。您可能还需要一个
sent
标志。在每次通知发送后,您将需要插入下一个通知,并再次预计算所有内容。这样,您的cronjob将非常轻量级,因为您将仅获取这一分钟的通知。别忘了在
发送时为
dispatch\u创建索引。任何原因都不能只存储