Php 标记为已阅读Laravel 5.3通知中的特定通知

Php 标记为已阅读Laravel 5.3通知中的特定通知,php,laravel,laravel-5,Php,Laravel,Laravel 5,我知道在L5.3中有很多方法可以将用户的所有通知标记为已读,如下所示: $user = App\User::find(1); foreach ($user->unreadNotifications as $notification) { $notification->markAsRead(); } <ul class="menu"> @foreach($AuthUser->unreadNotifications as $notif)

我知道在L5.3中有很多方法可以将用户的所有通知标记为已读,如下所示:

$user = App\User::find(1);

foreach ($user->unreadNotifications as $notification) {
    $notification->markAsRead();
}
<ul class="menu">
        @foreach($AuthUser->unreadNotifications as $notif)
            <li>
                <a href="{{$notif->data['action']}}" data-notif-id="{{$notif->id}}">
                    {{$notif->data['message']}}
                </a>
            </li>
        @endforeach
</ul>
或:

但假设我想用给定的ID将特定通知标记为已读

事实上,我已经列出了如下未读用户通知:

$user = App\User::find(1);

foreach ($user->unreadNotifications as $notification) {
    $notification->markAsRead();
}
<ul class="menu">
        @foreach($AuthUser->unreadNotifications as $notif)
            <li>
                <a href="{{$notif->data['action']}}" data-notif-id="{{$notif->id}}">
                    {{$notif->data['message']}}
                </a>
            </li>
        @endforeach
</ul>
NotifMarkAsRead
指以下控制器:

class NotificationController extends Controller
    {
        public function MarkAsRead (Request $request)
        {
              //What Do I do Here........
        }
    }
在没有任何
通知
模型的情况下,我如何做到这一点?

根据Github的说法,解决方案是:

照明\通知\数据库通知
是 通知已存在,您可以使用它按ID获取通知 然后删除它。如果您不想使用该模型,也可以使用 正常的数据库查询


这一点毫无疑问是有效的:

$id = auth()->user()->unreadNotifications[0]->id;
auth()->user()->unreadNotifications->where('id', $id)->markAsRead();

而不是以下内容:

$user->unreadNotifications->markAsRead(); 
让我们使用:

$user->unreadNotifications->first()->markAsRead();

您必须首先确保通知存在,以便可以对其进行调整,我不建议使用UnderNotifications对象,因为如果没有未读通知,则会因此发生错误

$notification_id = "03fac369-2f41-43d0-bccb-e364aa645f8a";
$Notification = Auth::user()->Notifications->find($notification_id);
if($Notification){
   $Notification->markAsRead();
}
也可以直接编辑,无需任何检查

DB::table('notifications')->where('id',$notification_id)->update(['read_at'=>Carbon::now()])

如果没有
通知
模型(因此,没有关系集),那么
未发送通知
方法从何而来?或者:是什么?自定义方法?
illighted\Notifications\Notifiable
trait提供了一个
markAsRead
方法,我在用户模型中使用了它。
unreadNotifications()
返回一个模型,因此可以使用链接进行过滤,比如:
$User->unreadNotifications()->where('Notifications.id',$id)->markAsRead()。或者,如果
markAsRead()
方法不可用,我也会尝试使用
->update(['read_at'=>Carbon::now()])
。这正是我试图找到的答案。感谢您提供的模型地址。只有代码的答案几乎总是可以通过添加一些关于它们如何工作以及为什么工作的解释来改进的。虽然此代码可以解决OP的问题,但最好包括关于您的代码如何解决OP问题的解释。通过这种方式,未来的访问者可以从您的帖子中学习,并将其应用到自己的代码中。因此,它不是一种编码服务,而是一种知识资源。此外,高质量、完整的答案更有可能被提升。这些特性,以及所有帖子都是独立的要求,是SO作为一个平台的一些优势,使其区别于论坛。您可以编辑以添加其他信息和/或用源文档补充说明。虽然此代码可能解决OP的问题,但最好包含有关代码如何解决OP问题的说明。通过这种方式,未来的访问者可以从您的帖子中学习,并将其应用到自己的代码中。因此,它不是一种编码服务,而是一种知识资源。此外,高质量、完整的答案更有可能被提升。这些特性,以及所有帖子都是独立的要求,是SO作为一个平台的一些优势,使其区别于论坛。您可以编辑以添加其他信息和/或用源文档补充说明。虽然此代码可能解决OP的问题,但最好包含有关代码如何解决OP问题的说明。通过这种方式,未来的访问者可以从您的帖子中学习,并将其应用到自己的代码中。因此,它不是一种编码服务,而是一种知识资源。此外,高质量、完整的答案更有可能被提升。这些特性,以及所有帖子都是独立的要求,是SO作为一个平台的一些优势,使其区别于论坛。您可以通过编辑添加其他信息和/或使用源文档补充说明。虽然这种方法允许将一个未读通知标记为已读,但实际上并不能让您控制它是哪一个通知。使用
firstWhere
或上述任何解决方案是更好的选择。
DB::table('notifications')->where('id',$notification_id)->update(['read_at'=>Carbon::now()])