You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 10:24:22