我有一个帖子系统。在我的网站上,用户可以发布文章,并对每篇文章发表评论。我想发布:当任何用户(不是帖子的作者)发表评论时,我需要向该帖子的作者发送通知,该帖子由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);
}
现在:创建评论后,通知会发送给帖子的作者,但是当作者可以回答发表他的评论时,通知会再次发送给他,但是我需要发送通知给作者评论。如何定义这种情况?我不需要总是将通知发送给帖子的作者,我需要通知和评论的作者,这些评论由帖子的作者回答。
答案 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
在这种情况下,您可能希望在以下情况下发送通知:
第一种情况似乎很直接。每当创建新评论时,您都会将已发表评论的帖子通知作者:
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));
}