有没有更有效的方法来获取视图中模型的数量? Laravel
Is there a more efficient way for grabbing the count of a model within the view? Laravel
我有图片。每张图片都有评论,每条评论都有点赞。在我看来,我想通过执行以下操作来显示评论的点赞数:
@foreach ($images as image)
<img href="$image->url">
<div class="comment-box">
@foreach ($image->comments as $comment)
<div class="comment">
<span class="comment-owner">{{ $comment->owner()->name }}</span> {{ $comment->body }}
<div class="likes">
{{ $comment->likes()->count() }} // ** HERE IS MY N+1 PROBLEM **
</div>
</div>
@endforeach
</div>
@endforeach
但是现在每次有评论时我都会获取一个查询。一个页面上可能有数百条评论,因此我会收到数百条查询,只是为了找到 count()
点赞。
我相信有一种方法可以通过执行类似
的操作来获取控制器中的计数
DB::raw('count(*) as like_count')
但我不知道如何在我的情况下实施。我可以把这种东西放在我的模型中,这样我就可以一直调用 {{ $comment->likes()->like_count }}
之类的东西吗?如何在没有 N+1 问题的情况下使 $comment->likes->count()
工作?
这里还有一些代码:
媒体模型
class Media extends Eloquent {
public function comments()
{
return $this->hasMany('Comment');
}
}
评论模型
class Comment extends Eloquent {
public function media()
{
return $this->belongsTo('Media');
}
public function likes()
{
return $this->hasMany('Like');
}
}
喜欢模特
class Like extends Eloquent {
public function comment()
{
return $this->belongsTo('Comment');
}
}
我的控制器
public function imageViewer($id)
{
$images = Media::with(['comments' => function($query) {
$query->with('likes');
}])->where('resource_id', $id)->simplePaginate(1);
return View::make('image-viewer', compact('images'));
}
你为什么不像这样使用 blade 的计数 count($comment->likes)
假设 $comment->likes
获得评论的点赞列表
@foreach ($images as image)
<img href="$image->url">
<div class="comment-box">
@foreach ($image->comments as $comment)
<div class="comment">
<span class="comment-owner">{{ $comment->owner()->name }}</span> {{ $comment->body }}
<div class="likes">
{{ count($comment->likes) }}
</div>
</div>
@endforeach
</div>
@endforeach
感谢@lukasgeiter 指出评论中的错误
我有图片。每张图片都有评论,每条评论都有点赞。在我看来,我想通过执行以下操作来显示评论的点赞数:
@foreach ($images as image)
<img href="$image->url">
<div class="comment-box">
@foreach ($image->comments as $comment)
<div class="comment">
<span class="comment-owner">{{ $comment->owner()->name }}</span> {{ $comment->body }}
<div class="likes">
{{ $comment->likes()->count() }} // ** HERE IS MY N+1 PROBLEM **
</div>
</div>
@endforeach
</div>
@endforeach
但是现在每次有评论时我都会获取一个查询。一个页面上可能有数百条评论,因此我会收到数百条查询,只是为了找到 count()
点赞。
我相信有一种方法可以通过执行类似
的操作来获取控制器中的计数DB::raw('count(*) as like_count')
但我不知道如何在我的情况下实施。我可以把这种东西放在我的模型中,这样我就可以一直调用 {{ $comment->likes()->like_count }}
之类的东西吗?如何在没有 N+1 问题的情况下使 $comment->likes->count()
工作?
这里还有一些代码:
媒体模型
class Media extends Eloquent {
public function comments()
{
return $this->hasMany('Comment');
}
}
评论模型
class Comment extends Eloquent {
public function media()
{
return $this->belongsTo('Media');
}
public function likes()
{
return $this->hasMany('Like');
}
}
喜欢模特
class Like extends Eloquent {
public function comment()
{
return $this->belongsTo('Comment');
}
}
我的控制器
public function imageViewer($id)
{
$images = Media::with(['comments' => function($query) {
$query->with('likes');
}])->where('resource_id', $id)->simplePaginate(1);
return View::make('image-viewer', compact('images'));
}
你为什么不像这样使用 blade 的计数 count($comment->likes)
假设 $comment->likes
获得评论的点赞列表
@foreach ($images as image)
<img href="$image->url">
<div class="comment-box">
@foreach ($image->comments as $comment)
<div class="comment">
<span class="comment-owner">{{ $comment->owner()->name }}</span> {{ $comment->body }}
<div class="likes">
{{ count($comment->likes) }}
</div>
</div>
@endforeach
</div>
@endforeach
感谢@lukasgeiter 指出评论中的错误