确定评论的用户并发送通知Laravel

时间:2019-04-04 20:21:58

标签: php laravel

我有一个帖子系统。在我的网站上,用户可以发布文章,并对每篇文章发表评论。我想发布:当任何用户(不是帖子的作者)发表评论时,我需要向该帖子的作者发送通知,该帖子由UserName进行评论...我这样做是:

在CommentController中,我有一种方法可以对帖子发表评论:

public function postComment(Post $post, AddPostRequest $request)
{
    if ($request->parent_id !== null) {
        $parent = Comment::where('id', $request->parent_id)->first();
        $this->authorize('canComment', $parent);
    }

    $data = [
        'user_id' => Auth::check() ? Auth::user()->id : null,
        'post_id' => $post->id
    ];

    $comment = $post->createComment(array_merge($request->except('g-recaptcha-response'), $data));

    $post->owner->sendReviewNotification($review);

    return $review;
}

在我的评论系统中,我嵌套了评论。在模型Post中,我有方法createReview.

public function owner()
{
    return $this->belongsTo(User::class, 'user_id');
}

public function comments()
{
    return $this->hasMany(Comment::class);
}

public function createComment($data = [])
{
    $review = $this->comments()->create($data);

    return $review;
}

在模型注释中,我有:

public function post()
{
    return $this->belongsTo(Post::class);
}

public function user()
{
    return $this->belongsTo(User::class);
}

public function parent()
{
    return $this->belongsTo(static::class, 'id', 'parent_id');
}

public function children()
{
    return $this->hasMany(static::class, 'parent_id');
}

public function scopeActive($query)
{
    return $query->whereNotNull('user_id')->where('active', 1);
}

现在:创建评论后,通知会发送给帖子的作者,但是当作者可以回答发表他的评论时,通知会再次发送给他,但是我需要发送通知给作者评论。如何定义这种情况?我不需要总是将通知发送给帖子的作者,我需要通知和评论的作者,这些评论由帖子的作者回答。

2 个答案:

答案 0 :(得分:0)

据我了解,您正在尝试通过以sendReviewNotification为参数的电子邮件类$review发送通知并通过电子邮件发送给帖子作者。  如果是这种情况,则此行

$post->owner->sendReviewNotification($review);

因为$post->owner返回了一种雄辩的关系(它是一个查询生成器)

这就是我要这样做的方式。 我将使用上面的关系来获取用户的(作者)电子邮件地址

$post->owner->email

上面的行将返回作者的电子邮件地址

然后使用邮件Facade

Mail::to($post->owner->email)->send(new sendReviewNotification($review));

我假设sendReviewNotification是您的邮件类别 还记得在类的开头在名称空间下添加此行。 use Illuminate\Support\Facades\Mail;

答案 1 :(得分:0)

我认为您真正想要的是向讨论的每个参与者发送通知,但仅向自您上次评论以来发表评论的人发送通知:

Post #4321 (Author Richard)
  -> Comment #1 by John
  -> Comment #2 by Elias
  -> Comment #3 by Richard    <-- the author
  -> Comment #4 by Michael
  -> Comment #5 by John
  -> Comment #6 by Merry
  -> Comment #7 by Richard    <-- the author

在这种情况下,您可能希望在以下情况下发送通知:

  1. 如果有人对他的帖子发表了评论,就会通知理查德
  2. 如果Richard也发表评论,则会通知评论作者

第一种情况似乎很直接。每当创建新评论时,您都会将已发表评论的帖子通知作者:

if ($comment->author_id !== $comment->post->author_id) {
    $comment->post->author->notify(new PostWasCommented($comment));
}

如您所见,我希望您使用Laravel内置的notification system。坦白地说,这使您的生活更加轻松。


第二种情况更加复杂,并且再次允许两种可能的解决方案:

  • 您会在Richard发表评论之前向所有对此评论发表评论的人发送通知。
    在上面的示例中,当Richard创建注释3时,John和Elias将收到通知。当理查德(Richard)创建第7条评论时,约翰(John),埃里亚斯(Elias),迈克尔(Michael)和迈里(Merry)会收到通知。 ({$comment是要创建的新注释。)

    $users = User::query()
        ->whereHas('comment', function ($query) use ($comment) {
            return $query->where('post_id', $comment->post_id);
        })
        ->where('user_id', '!=', $comment->post->author_id)
        ->get();
    
    foreach ($users as $user) {
        $user->notify(new PostWasCommented($comment));
    }
    
  • 您只向自作者发表最后评论以来发表评论的人发送通知。
    根据上述示例,这意味着当Richard创建注释3时,将通知John和Elias。当理查德(Richard)创建第7条评论时,只有迈克尔(Michael),约翰(John)和梅里(Merry)会收到通知,但不会通知埃里亚斯(Elias)。这是因为只有这三个人在#3和#7之间发表了评论。

    $users = User::query()
        ->whereHas('comment', function ($query) use ($comment) {
            return $query->where('post_id', $comment->post_id)
                ->where(
                   'created_at', 
                   '>', 
                   DB::raw(
                       "SELECT MAX(created_at) FROM comments WHERE post_id = ? AND author_id = ?", 
                       [$comment->post_id, $comment->author_id]
                   )
                );
        })
        ->where('user_id', '!=', $comment->post->author_id)
        ->get();
    
    foreach ($users as $user) {
        $user->notify(new PostWasCommented($comment));
    }