我有3个数据库表。
users
id - integer
username - string
post
id - integer
user_id - integer
topic - string
comments
id - integer
user_id - integer
post_id - integer
我在视图中所做的是通过执行类似
之类的操作循环浏览用户创建的所有帖子Post::where('user_id', Auth::user()->id)->get();
在每篇帖子中,其他用户都可以对其进行评论。我想在帖子上显示一个计数,它统计有多少用户对该帖子发表了评论。我认为创建一个hasManyThrough关系可以在这里工作,但我继续为用户获得'0'计数。
用户模型:
class User extends Model {
public function post()
{
return $this->hasMany('App\Post')
}
public function comment()
{
return $this->hasMany('App\Comment', 'user_id')
}
}
发布模型:
class Post extends Model {
public function user()
{
return $this->belongsTo('App\User')
}
public function comment()
{
return $this->hasMany('App\Comment')
}
// I thought this method below would return the users who had commented on the post
public function commenters()
{
return $this->hasManyThrough('App\User', 'App\Comment', 'user_id', 'username');
}
}
评论模型:
class Comment extends Model {
pubic function user()
{
return $this->belongsTo('App\User')
}
public function post()
{
return $this->belongsTo('App\Post')
}
}
所以最终的结果应该是这样的猜测吗?
查看:
<span>{{ $model->modelmethod->count() }}</span>
你们这里有什么意见?这是正确的方法吗?或者你推荐的是什么?
答案 0 :(得分:0)
要解决您的第一个问题,我在视图中所做的是通过执行类似的操作来循环浏览用户创建的所有帖子,您可以使用Eager Loading - 但是,这将要求您访问嵌套元素。此查询检索用户及其所有帖子,包括评论者:
$user = User::with('post.commenters')->where('id', $userId)->firstOrFail();
通过这种方式,您可以使用$user->post
访问一系列用户帖子。然后,要访问它的评论者,您可以指定数组索引(或使用foreach loop)。即:
//this is array access, accessing first post
$user->post[0];
//this iterate all post using foreach
foreach($user->post as $posts){
$post-> //do something with current post?
}
至于你的第二个麻烦,计算,它可以在数据库查询中完成 - 或者在视图中(我经常在视图中这样做,因为它相当简单,可读,并且查询较少)。
//this prints all posts number of commenters - in blade
@foreach($user->post as $posts)
@foreach($posts->commenter as $commenter)
{{ count($commenter) }}
@endforeach
@endforeach
修改强> 看起来我很想仔细阅读你的模型,它......无法完成
return $this->hasManyThrough('App\User', 'App\Comment', 'user_id', 'username');
应该是
return $this->hasManyThrough('App\User', 'App\Comment', 'user_id', 'id');
因为你实际上在评论中使用user_id而不是用户名作为外键。