Laravel Notification如何标记指定cartId对应的数据库通知为已读
实现方法
你现有通知里存储cartId的逻辑已经满足需求,不需要修改toArray方法的代码,直接在卖家受理订单的业务逻辑节点追加批量标记已读的代码即可。
Laravel默认生成的notifications通知表中,data字段为JSON类型,type字段存储通知类的完整类名,直接通过框架内置的DatabaseNotification模型做条件批量更新即可,具体实现如下:
- 首先在业务代码顶部引入依赖类:
use Illuminate\Notifications\DatabaseNotification; use Carbon\Carbon;
- 在卖家受理订单的核心逻辑(比如订单状态更新为已受理)之后,追加以下代码:
// 原有订单受理逻辑示例,根据你的实际业务替换 $order->status = 'accepted'; $order->save(); // 替换为你实际需要匹配的购物车ID $specific_id = $order->cart_id; // 批量标记符合条件的通知为已读 DatabaseNotification::query() // 匹配你自定义的订单通知类型,注意替换为你项目中customerOrderNorification类的实际完整命名空间 ->where('type', \App\Notifications\customerOrderNorification::class) // 匹配通知数据中存储的cartId ->where('data->cartId', $specific_id) // 仅处理未读通知,避免重复更新 ->whereNull('read_at') ->update([ 'read_at' => Carbon::now() ]);
注意事项
- 请核对自定义通知类的命名空间,
type字段的查询值必须和notifications表中存储的类名完全一致,否则无法匹配到目标通知。另外你当前的通知类名customerOrderNorification存在拼写偏差(正确拼写为Notification),如果是笔误请同步修正查询条件。- 该JSON查询写法要求MySQL版本≥5.7、PostgreSQL版本≥9.2,若使用低版本数据库请先升级后再使用。
- 如果仅需要标记某个指定用户下的对应通知,可在查询链中追加
->where('notifiable_id', $目标用户ID)、->where('notifiable_type', \App\Models\User::class)条件缩小查询范围。- 如果需要触发
DatabaseNotification模型的已读相关事件,请不要使用批量update写法,改为查询出符合条件的通知集合后循环调用markAsRead()方法即可,该写法性能更低,非必要不推荐。
内容的提问来源于stack exchange,提问作者aref razavi
相关产品推荐
相关产品推荐

