我有一个发票模型。我尝试如果已接近到期时间,将通知发送给用户,但我不知道怎么办。
我的桌子:
| 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','....');
答案 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();