【问题标题】:Laravel where clause based on conditions from value in databaseLaravel where 子句基于数据库中值的条件
【发布时间】:2021-01-16 05:05:48
【问题描述】:

我正在构建一个事件提醒页面,人们可以在其中为某些事件设置提醒。用户可以选择在需要通知之前设置多长时间。它存储在notification_timenotification_unit 中。 notification_time 跟踪他们想要收到通知之前的时间,notification_unit 跟踪他们选择时间的 PHP 日期格式,例如。 i 分钟,H 小时。

例如。 notification_time - 2 和notification_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'));
})

在这个函数中,我对'i', 60 进行了硬编码,而它应该从数据库中获取。 event_time 也是同一张表的一部分

表格看起来像这样 -

idevent_time...notification_unitnotification_timecreated_atupdated_at

有什么办法可以解决这个问题吗?是否可以用 SQL 做同样的逻辑?

【问题讨论】:

  • 有什么理由不能只存储notify_at 列,以及他们想要收到通知的日期时间吗?您可以在创建记录时存储它,而不是存储时间和单位。我认为你过于复杂了。我不知道有什么方法可以在 SQL 中做到这一点(我相信你可以),而 Laravel 解决方案将涉及加载所有记录,解析时间,然后过滤掉那些不t align,这是一个非常强大的功能。
  • @TimLewis 需要比这复杂得多,提醒可以是每年一次的重复类型,因此将特定日期存储为notify_at 根本不合逻辑。加载所有记录是巨大的,因为该函数每分钟运行一次。想象一下有一个包含 10k+ 条记录的数据库。哦,我的案子也有 6 张桌子做同样的事情。
  • 该响应是有道理的 :) 我只是问是否可以使用静态列而不是尝试以编程方式创建它。不幸的是,我仍然没有办法,但我会密切关注这个问题;看起来很有趣
  • 你的问题很有趣。我会试着把事情混在一起。一个表格用于提醒您的实际配置,另一个表格用于通知。第二个表应该预先计算了notify_at。您可能还需要一个 sent 标志。每次发送通知后,您都需要插入下一个通知,并再次预先计算所有内容。这样,您的 cronjob 将非常轻量级,因为您只会获取这一分钟的通知。不要忘记为dispatch_atsent 创建索引。

标签: sql laravel


【解决方案1】:

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

第一个解决方案


Mysql 有DATEDIFFDATE_SUB 来获取时间戳差异并从时间戳中减去某些间隔。就我而言,该功能每分钟运行一次。要使用它们,我必须重构我的数据库,以便在几秒钟内将timeunit 存储在数据库中。然后进行计算。我选择不使用这种方式,因为我每分钟都在运行该函数,因此这两个操作在服务器端都有点繁重。

第二种解决方案


这是我个人在我的案例中所做的解决方案。在这里,我在将其存储在数据库中时进行了计算。意义?让我解释。我创建了一个新表notification_settings,它链接到提醒(一对一关系)。表格是这样的

idunittimenotify_atrepeatingcreated_atupdated_at

unittime 列仅在显示提醒时使用。我所做的是,我计算了何时在notify_at 列中收到通知。所以在事件调度器中,我需要检查当前的提醒(因为我每分钟都在运行它)。 repeating 列用于跟踪提醒是否重复。如果重复,我会在调度时重新计算notify_at 列。一旦用户收到通知,notify_at 将设置为 null。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2017-03-17
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多