这是正确的Laravel 5模型关系吗?

时间:2015-12-10 06:48:20

标签: laravel orm laravel-5 eloquent

我有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>

你们这里有什么意见?这是正确的方法吗?或者你推荐的是什么?

1 个答案:

答案 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而不是用户名作为外键。