临近到期时间时(每年)如何向用户发送通知

时间:2018-08-01 11:54:50

标签: php mysql laravel

我有一个发票模型。我尝试如果已接近到期时间,将通知发送给用户,但我不知道怎么办。

我的桌子:

| service_name | start_date(date) | notification_at(date) |
|:-------------|-----------------:|:---------------------:|
| example      | 2018-08-01       |         NULL          |

如果指定的开始日期设置为日期,我希望每年30天之前向用户发送通知。因此,现在2019-07-1时发送通知。如何在Laravel中每天使用schedule进行检查?

我尝试过案例:

Invoice::whereNotNull('start_date')->whereDate('start_date','....');

1 个答案:

答案 0 :(得分:0)

已解决

实际上,我想做的场景就是这些。例如,

  • 应该首先发送通知日期为2019-07-01(每年30天)

  • 应该第二次发送通知的日期为2019-07-15(每年15天)

  • 应该是第三次发送通知日期为2019-07-26(每年5天)

  • 总是应该在明年重复这些步骤

我找到了这样的解决方案。首先,我确实像这样修改了My Table。

| service_name | start_date(date) | next_notification_date(date) | next_add_day(int) |
|:-------------|-----------------:|:----------------------------:|:-----------------:|
| example      | 2018-08-01       |             NULL             |        NULL       |

然后我为该过程创建一个命令类。

ExpirationCommand.php

public function handle()
{
        $now = Carbon::now();

        Invoice::whereNotNull('start_date')->whereDate('next_notification_date', $now->format('Y-m-d'))->each(function ($invoice) use ($now) {
            // defines
            $addDay = $invoice->next_add_day;
            $addYear = 365 - 30 - 15 - 5;

            // send notification
            event(new ExpirationInvoiceEvent($invoice->project,$invoice->next_notification_date->diffInDays($now)));

            // setup db
            if ( ! $addDay || $addDay === $addYear) {
                $addDay = 30;
            } elseif ($addDay !== 15 && $addDay !== 5) {
                $addDay = 15;
            } elseif ($addDay !== 5) {
                $addDay = 5;
            } else {
                $addDay = $addYear;
            }

            $invoice->update([
                'next_notification_date' => $now->addDay($addDay)->format('Y-m-d'),
                'next_add_day'           => $addDay,
            ]);
        });
}

最后,我在 Console \ Kernel.php 中添加了一天两次的控制命令

$schedule->command('expiration-control')->twiceDaily();