我想在我的项目中实施一个系统,当其中一个帖子发表新评论时会“警告”用户。
我目前正在查询来自登录用户的帖子的所有评论,并将所有内容放入数组并将其发送到我的视图。
现在我的目标是在此阵列中有新项目时制作警报图标。它不必与ajax一起使用只是页面加载已经很好了:)
所以我在我的UsersController中创建了一个函数,在这里我得到了这里的注释是我的代码
public function getProfileNotifications()
{
$uid = Auth::user()->id;
$projects = User::find($uid)->projects;
//comments
if (!empty($projects)) {
foreach ($projects as $project) {
$comments_collection[] = $project->comments;
}
}
if (!empty($comments_collection)) {
$comments = array_collapse($comments_collection);
foreach($comments as $com)
{
if ($com->from_user != Auth::user()->id) {
$ofdate = $com->created_at;
$commentdate = date("d M", strtotime($ofdate));
$comarr[] = array(
'date' => $ofdate,
$commentdate,User::find($com->from_user)->name,
User::find($com->from_user)->email,
Project::find($com->on_projects)->title,
$com->on_projects,
$com->body,
Project::find($com->on_projects)->file_name,
User::find($com->from_user)->file_name
);
}
}
} else {
$comarr = "";
}
}
如果阵列中有新项目,是否可以检查页面加载?比如保持计数,然后进行新计数并从新计数中减去先前的计数?
这甚至是评价这个的好方法吗?
非常感谢提前!任何帮助表示赞赏。
所以我在我的表中添加了一个未读的字段,我试着像这样计算我的注释数组中未读的数量:
$uid = Auth::user()->id;
$projects = User::find($uid)->projects;
//comments
if (!empty($projects)) {
foreach ($projects as $project) {
$comments_collection[] = $project->comments;
}
}
$unreads = $comments_collection->where('unread', 1);
dd($unreads->count());
但是我收到了这个错误:
调用成员函数where()on array
任何人都知道如何解决这个问题?
答案 0 :(得分:2)
"标准"这样做的方法是跟踪评论所有者是否已经阅读"评论。您可以通过添加"未读"相当容易地做到这一点。 (或类似的东西)旗帜。
当你构建模型时,你应该define all their relationships以便这样的东西变得相对容易。
如果您没有关系,则需要定义如下内容:
在用户
public function comments()
{
return $this->hasMany('App\Models\Comment');
}
在项目中
$count = $user->projects()
->comments()
->where('unread', true)
->count();
一旦你开始关系,你就可以做到以下几点。根据需要添加过滤。
jQuery.ajax( '/users/{userId}/projects/{projectId}/comments/{commentId}', {
method: 'patch'
dataType: 'json',
data: {
'unread': false
}
})
这是您向用户显示的数字。当他们执行某个操作时,您认为他们已经确认了该评论,您会发送异步请求以将评论标记为已读。 REST-ish方法可能如下所示:
Javascript,使用JQuery:
$comment = Comment::find($commentId);
$comment->update($patchData);
PHP,补丁方法:
.classList.add()
请注意,您可以使用Laravel's RESTful Resource Controllers来提供此行为。
答案 1 :(得分:0)
试试这个
$unreads = $project->comments()->where('unread', 1);
dd($unreads->count());
修改强>
我的Has Many Through关系符合您的需求
user.php的
public function comments()
{
return $this->hasManyTrough('App\Project', 'App\Comment');
}
Project.php
public function comments()
{
return $this->hasMany('App\Comment');
}
然后您可以直接从用户访问comments
$user->comments()->where('unread', 1)->count();
或者我建议您在hasUnreadComments
User
方法
public function hasUnreadComments()
{
$return (bool) $this->comments()->where('unread', 1)->count();
}
P.S。
$uid = Auth::user()->id;
$projects = User::find($uid)->projects;
这段代码太可怕了,这种方式好多了
$projects = Auth::user()->projects;