【问题标题】:Laravel hasMany relation count number of likes and comments on postLaravel hasMany 关系统计帖子的点赞数和评论数
【发布时间】:2017-09-29 21:12:46
【问题描述】:

代码:

$posts = Jumpsite::find($jid)
            ->posts()
            ->with('comments')
            ->with('likes')
            ->with('number_of_comments')
            ->with('number_of_likes')
            ->where('reply_to', 0)
            ->orderBy('pid', 'DESC')
            ->paginate(10);

每个帖子都有评论和喜欢。我最初只显示几个 cmets 以避免大负载。但我想显示每个帖子的总 cmets 和喜欢的数量。我该怎么做?

型号代码:

public function likes()
{
    return $this->hasMany('Like', 'pid', 'pid');
}

public function comments()
{
    return $this->hasMany('Post', 'reply_to', 'pid')->with('likes')->take(4);
}

public function number_of_likes()
{
    return $this->hasMany('Like', 'pid', 'pid')->count();
}

注意:

This is an API. All will be returned as JSON.

更新

回报

Post
    author_id
    message
    Comments(recent 4)
        user_id
        message
        post_date
        Number_of_likes
    Likes
        user_id
    Number_of_total_comments
    Number_of_total_likes

更新

我如何返回数据

$posts  = $posts->toArray();
$posts  = $posts['data'];

return Response::json(array(
   'data' => $posts
));

只需使用它,我就可以在 json 中获得我想要的所有数据。但我也想添加总数。


更新

protected $appends = array('total_likes');

public function getTotalLikesAttribute()
{
   return $this->hasMany('Like')->whereUserId($this->uid)->wherePostId($this->pid)->count();

}

但得到错误:

 Unknown column 'likes.post_id'

错误

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'likes.post_id' in 'where clause' (SQL: select count(*) as aggregate from `likes` where `likes`.`deleted_at` is null and `likes`.`post_id` = 4 and `pid` = 4 and `uid` = 1)

【问题讨论】:

  • 您想统计每个帖子还是需要特定帖子时?
  • @Anam 我想统计每个帖子的数量。这就像一个饲料。让我们说一个 Facebook 时间线。
  • Post 中的 author_id 和 likes 中的 user_id 有什么不同?他们是一样的吗?
  • 你的likes 表中有post_id 列吗? Laravel 在 likes 表中找不到 post_id。
  • @Anam 不,我不知道。我在所有表上都有 user_id 的 uid 和 post_id 的 pid。我如何告诉 laravel 找到 pid?

标签: php mysql laravel eloquent


【解决方案1】:

您可以使用以下代码来计算关系模型结果。

 $posts = App\Post::withCount('comments')->get(); foreach ($posts as $post) { echo $post->comments_count; }

还可以像这样设置条件

$posts = Post::withCount(['votes', 'comments' => function ($query) { $query->where('content', 'like', 'foo%'); }])->get();

【讨论】:

  • 这是正确答案。它避免加载整个集合以获取其元素的数量。
  • 谢谢。 @Mateusz
【解决方案2】:

在您的模型中放置以下访问器:

点赞总数:

 public function getTotalLikesAttribute()
 {
    return $this->hasMany('Like')->whereUserId($this->author_id)->count();

 }

计算 cmets 总数:

从您的描述中,我可以看到,您检索到的帖子数量为 cmets

public function getTotalCommentsAttribute()
{
    return $this->hasMany('Post')->whereUserId($this->author_id)->count();    
}

现在,通过您的控制器:

$post  = Jumpsite::find($jid);

// total comments
var_dump( $post->total_comments );

// total Likes
var_dump( $post->total_likes );

【讨论】:

  • 是的 cmets 只是与父母的帖子。这样,我只有 1 个用于帖子和 cmets 的表。如果帖子的父级为 0,则它是帖子而不是评论。我现在就试试这个。
  • 无论如何,如何将它显示到我的 json 返回中?它仍然没有被添加到回报中。我更新了我的问题。 laravel 文档中也没有详细记录访问器。
  • 如果您转储变量,是否看到计数?
  • 'where 子句'中的未知列 'likes.post_id' 应该是 likes.pid
  • 谢谢。我终于让它工作了。并对此进行了很好的解释。
【解决方案3】:

计算 laravel 中所有博客文章的 cmets

第 1 步:将此代码放入您的“发布”模型中。

// Get the comments for the blog post.
public function comments()
{
    return $this->hasMany('App\Comment');
}

第 2 步:将此代码放入您的“PostController”控制器中。

 $posts= Post::all();
 return view('home')->with('posts', $posts);

第 3 步:然后使用以下代码计算所有帖子的 cmets。

@foreach($posts as $row)
 {{$row->comments->count()}}
@endforeach

在此处查看详细信息:http://www.pranms.com/count-comments-for-all-blog-posts-in-laravel/

【讨论】:

    【解决方案4】:

    只需进行一次更改即可获得计数结果

    相关

     public function getTotalLikesAttribute(){
        return $this->hasMany('Like')->where('author_id',$this->author_id)->count();
    }
    

    在视图中

    $post->getTotalLikesAttribute()
    

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2022-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      相关资源
      最近更新 更多