【发布时间】:2019-07-23 15:10:12
【问题描述】:
每次创建或更新用户时,都会在达到某个时间戳时发送一封电子邮件。
我通过队列来控制它。每个队列都存储在“jobs”表中。
该表有一个名为“payload”的列,它是一个包含该作业所有信息的 json。就我而言,它的有效载荷是这样的:
{
"job":"Illuminate\\Queue\\CallQueuedHandler@call",
"data":{
"commandName":"Illuminate\\Mail\\SendQueuedMailable",
"command":"O:34:\"Illuminate\\Mail\\SendQueuedMailable\":1:{s:11:\"\u0000*\u0000mailable\";O:16:\"App\\Mail\\Expired\":16:{s:7:\"\u0000*\u0000user\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":2:{s:5:\"class\";s:8:\"App\\User\";s:2:\"id\";i:1020;}s:4:\"from\";a:0:{}s:2:\"to\";a:1:{i:0;a:2:{s:7:\"address\";s:24:\" example@gmail.com\"\";s:4:\"name\";N;}}s:2:\"cc\";a:0:{}s:3:\"bcc\";a:0:{}s:7:\"replyTo\";a:0:{}s:7:\"subject\";N;s:4:\"view\";N;s:8:\"textView\";N;s:8:\"viewData\";a:0:{}s:11:\"attachments\";a:0:{}s:14:\"rawAttachments\";a:0:{}s:9:\"callbacks\";a:0:{}s:10:\"connection\";N;s:5:\"queue\";N;s:5:\"delay\";N;}}"
}
}
如您所见,有工作与:App\\User\";s:2:\"id\";i:1020
如何通过该用户 ID 从表中删除该作业?我可以使用 DB::table('jobs) 获取所有数据并循环,直到我在 payload 中找到 id 并将其删除,但是 Laravel 是否有任何帮助程序或函数可以做到这一点?
【问题讨论】:
-
它没有辅助函数,部分原因是某些队列引擎根本不允许您这样做。改变方法可能会更好——让你的工作检查它是否应该作为代码的一部分继续存在。例如,它可以检查用户是否已被删除并跳过电子邮件发送。
-
当我更新用户时,该时间戳也可能会更新(未来是“时间试用日期”)。每次达到该时间试用期时都会发送一封邮件,但我必须删除与旧时间戳关联的作业,因为我不想在每次达到该时间戳时都发送电子邮件。
-
也许您需要一个“我应该立即发送给谁”的计划任务,而不是排队的作业。
-
收到通知的邮件我也可以更新,或者每封邮件都可以删除,我不知道如何通过调度来做到这一点。
标签: json laravel laravel-queue