问题描述
我正在尝试使用 laravel eloquent 来计算 laravel 8 中单个帖子的评论数量。但我没有在刀片中获得任何值,它在视图中只是空白。
后模型
public function comments()
{
return $this->hasMany('App\Models\Comment');
}
评论模型
public function post()
{
return $this->belongsTo('App\Models\Post');
}
控制器
use App\Models\Post;
use App\Models\Comment;
use Illuminate\Database\Eloquent\Model;
public function index(Post $post)
{
$counters = $post->withCount('comments')
->orderBy('created_at','desc');
return view('app/blog',compact('counters'));
}
查看(刀片文件)
@foreach($counters as $counter)
<p>Comments :$counter->comments_count</p>
@endforeach
解决方法
首先,将刀片更改为回显输出。
@foreach($counters as $counter)
<p>Comments: {{ $counter->comments_count }}</p>
@endforeach
然后将您的控制器更改为
public function index(Post $post)
{
$counters = Post::withCount('comments')
->orderBy('created_at','desc')
->get();
return view('app/blog',compact('counters'));
}
您使用了错误的 withCount
方法。它旨在用于查询构建器,而不是用于单个模型。
此控制器现在将返回所有帖子,然后将 comments_count
附加到每个帖子。这似乎是你想要的。
我还在索引签名中留下了 $post
,但它可能会被删除,因为您的刀片似乎需要所有帖子。
如果不是,则将控制器更改为:
public function index(Post $post)
{
$counters = Post::withCount('comments')
->where('id',$post->id)
->orderBy('created_at',compact('counters'));
}
或者,也许您想要该帖子中的所有评论,在这种情况下,请执行此操作。
public function index(Post $post)
{
$counters = $post->comments()->count();
return view('app/blog',compact('counters'));
}
<p>Comments: {{ $counters }}</p>
请注意,我在评论关系上使用了括号。这是为了加快查询速度,因为它只会查询数据库的记录数,而不是获取所有数据,然后再计算记录数。
此外,我从刀片中删除了 foreach,因为 $counters
现在只返回一个整数。
you don't have to do a query for this. Just do the following
**in controller**
public function index(Post $post)
{
$counters = count($post->comments);
return view('app/blog',compact('counters'));
}
**and in view(blade file)**
<p>Comments :{{$counters }}</p>