在Laravel应用中,当短时间内有大量事件触发通知时,用户可能会收到过多的重复或相似通知,导致体验不佳。本文将详细介绍如何通过优化Laravel的数据库通知机制,实现在特定时间窗口内合并或更新现有通知,而非创建新的通知,从而有效减少通知数量,提升用户体验。
在现代Web应用中,通知是与用户互动的重要手段。然而,如果通知系统设计不当,例如在短时间内针对同一事件或同一类事件发送大量独立通知,用户体验将大打折扣,可能导致“通知疲劳”,甚至让用户选择关闭通知功能。为了解决这一问题,我们需要一种机制,能够在特定条件下对通知进行“去重”或“合并”,例如,在30分钟内,将关于同一主题的多个通知合并为一个,只更新其计数或内容。
Laravel的通知系统提供了一个便捷的方式来向用户发送各类通知。对于数据库通知,我们通常会在通知类的 toDatabase 方法中定义要存储到 notifications 表中的数据。当 Notification::send() 方法被调用时,Laravel会调用相应渠道(如 toDatabase)的方法,并将其返回的数据存储起来。
toDatabase 方法的典型结构如下:
public function toDatabase($notifiable): array
{
return [
'content' => '这是一条新通知',
'type' => 'post_created',
'post_id' => $this->post->id,
];
}Laravel会将这个返回的数组存储到 notifications 表的 data 字段中。
我们的核心策略是:当一个事件触发通知时,首先检查在预设的时间窗口(例如30分钟)内,是否已经存在一个针对相同主题的通知。
实现通知合并逻辑为了实现上述策略,我们需要修改通知类中的 toDatabase 方法。原始的问题代码尝试在找到现有通知后进行更新,但最终仍然会执行方法末尾的 return [] 语句,导致即使更新了旧通知,也会创建一条新通知。
关键在于:当成功更新现有通知后,必须阻止 toDatabase 方法继续返回一个非空的数组,因为任何非空数组都会被Laravel视为一条新的通知记录来存储。 返回一个空数组 [] 或 null 是阻止新通知创建的有效方式。
下面是优化后的 toDatabase 方法示例:
search = $search;
$this->postTitle = $postTitle;
}
/**
* 获取通知的交付渠道。
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable): array
{
return ['database'];
}
/**
* 将通知转换为数据库存储的数组。
*
* @param mixed $notifiable
* @return array
*/
public function toDatabase($notifiable): array
{
$timeWindowMinutes = 30; // 定义时间窗口:30分钟
$searchIdentifier = $this->search->id; // 用于识别相关通知的唯一标识
// 尝试查找在指定时间窗口内,针对当前搜索条件已存在的通知
$existingNotification = $notifiable->notifications()
->where('data->search_id', $searchIdentifier) // 使用 data->search_id 进行查询
->where('created_at', '>=', now()->subMinutes($timeWindowMinutes))
->first();
if ($existingNotification) {
// 如果找到了现有通知,则更新它
$currentCount = $existingNotification->data['count'] ?? 0;
$newCount = $currentCount + 1;
$existingNotification->update([
'data' => array_merge($existingNotification->data, [
'content' => [
'en' => "{$newCount} new posts matched with your saved search '{$this->search->title}' have been posted. Click to view more.",
'zh' => "您的保存搜索 '{$this->search->title}' 匹配到 {$newCount} 篇新帖子。点击查看更多。",
],
'count' => $newCount,
// 可以更新其他相关数据,例如最后更新时间
'last_updated_at' => now()->toDateTimeString(),
// 确保 search_id 和 parameters 等关键标识符仍然存在
'search_id' => $searchIdentifier,
'parameters' => $this->search->parameters,
])
]);
// 关键:返回一个空数组,阻止Laravel创建新的通知记录
return [];
}
// 如果在时间窗口内没有找到现有通知,则创建一条新的通知
return [
'content' => [
'en' => "1 new post matched with your saved search '{$this->search->title}' has been posted. Click to view more.",
'zh' => "您的保存搜索 '{$this->search->title}' 匹配到 1 篇新帖子。点击查看更多。",
],
'count' => 1,
'search_id' => $searchIdentifier, // 用于后续查询的标识符
'parameters' => $this->search->parameters,
'first_matched_post_title' => $this->postTitle, // 首次匹配到的帖子标题
'created_at' => now()->toDateTimeString(), // 记录创建时间
];
}
}代码解析:
created_at 与 updated_at 的选择:
data 字段的设计:
性能考量:
用户体验:
其他通知渠道:
通过在Laravel通知类的 toDatabase 方法中引入条件判断和早期返回机制,我们可以有效地实现数据库通知的智能合并与去重。这不仅能够显著减少用户收到的通知数量,避免“通知疲劳”,还能提升整体的用户体验。合理设计 data 字段结构,并结合索引优化,可以确保此方案在不同规模的应用中都能高效运行。
# php
# laravel
# js
# 前端
# json
# go
# app
# win
# 多语言
# NULL
# if
# count
# 标识符
# 事件
# this
# 数据库
# 您的
# 这是
# 会在
# 点击查看
# 则更
# 是一个
# 进阶
# 找到了
# 这一
# 使用了
相关文章:
如何正确选择百度移动适配建站域名?
建设网站制作价格,怎样建立自己的公司网站?
C#如何使用XPathNavigator高效查询XML
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
山东云建站价格为何差异显著?
济南企业网站制作公司,济南社保单位网上缴费步骤?
已有域名和空间如何快速搭建网站?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
如何做网站制作流程,*游戏网站怎么搭建?
广州美橙建站如何快速搭建多端合一网站?
如何自定义建站之星网站的导航菜单样式?
如何在腾讯云服务器快速搭建个人网站?
建站之星如何助力企业快速打造五合一网站?
如何在腾讯云免费申请建站?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
如何构建满足综合性能需求的优质建站方案?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
独立制作一个网站多少钱,建立网站需要花多少钱?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
如何在Windows 2008云服务器安全搭建网站?
如何通过VPS建站无需域名直接访问?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
nginx修改上传文件大小限制的方法
如何在云虚拟主机上快速搭建个人网站?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
建站之星安装提示数据库无法连接如何解决?
中山网站制作网页,中山新生登记系统登记流程?
如何在建站之星绑定自定义域名?
建站之星安装后如何配置SEO及设计样式?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
如何用花生壳三步快速搭建专属网站?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
定制建站哪家更专业可靠?推荐榜单揭晓
零服务器AI建站解决方案:快速部署与云端平台低成本实践
北京的网站制作公司有哪些,哪个视频网站最好?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
如何在IIS中配置站点IP、端口及主机头?
建站之星如何修改网站生成路径?
建站主机空间推荐 高性价比配置与快速部署方案解析
建站之星CMS建站配置指南:模板选择与SEO优化技巧
如何通过远程VPS快速搭建个人网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。