Laravel检测数组中是否有新项

时间:2016-06-13 22:10:49

标签: php arrays laravel

我想在我的项目中实施一个系统,当其中一个帖子发表新评论时会“警告”用户。

我目前正在查询来自登录用户的帖子的所有评论,并将所有内容放入数组并将其发送到我的视图。

现在我的目标是在此阵列中有新项目时制作警报图标。它不必与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

任何人都知道如何解决这个问题?

2 个答案:

答案 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;