2016-09-10 58 views
0

我正在尝试使用数据透视表来实现多对多的关系。我的数据透视表的名称是“post_tag”,列名是“post_id”和“tag_id”。帖子和标签模型类如下所示。Laravel 5.2.29多对多关系不能正常工作

class Post extends Model 
{ 
    protected $fillable = array(
     'title', 
     'text', 
     'active', 
     'user_id' 
    ); 

    public function user() 
    { 
     return $this->belongsTo('App\Post'); 
    } 

    public function comments() 
    { 
     return $this->hasMany('App\Comment'); 
    } 

    public function tags() 
    { 
     return $this->hasMany('App\Post', 'post_id'); 
    } 

} 

和标签类如下:

class Tag extends Model 
{ 
    public function posts() 
    { 
     return $this->hasMany('App\Post'); 
    } 
} 

的post_tag表看起来象下面这样:

 
post_id tag_id 
1  1 
1  2 
2  1 

我使用下面的代码尝试该职位标签:

$user = User::find(1); 
    foreach ($user->posts as $post) { 
     foreach ($post->tags as $tag) { 
      print $tag->title; 
      print "<br>"; 
     } 
     print "<br>"; 
    } 

但它抛出一个错误:

QueryException在Connection.php线729:未发现柱: SQLSTATE [42S22] 1054未知列在 'where子句'(SQL 'posts.post_id':SELECT * FROM posts其中postspost_id = 1和postspost_id不为空)

我想我错过了一些东西。任何人都可以让我知道。

感谢

+0

您的标签上Post模型方法必须连接到App /标签,而不是应用程序/后 – follio

回答

1

您在帖子模型tags()方法设置错误的关系。它应该是return $this->belongsToMany('App\Tag');

而且在标签模型posts()方法,你应该设置返回$this->belongsToMany('App\Post');

欲了解更多信息,你可以看到它在laravel docs

+0

嗨,我修改了方法,所以这是看起来象下面这样: 公共功能标签(){ 回报 $这个 - >的hasMany(“应用程序\标签”); } 但它仍然不起作用。它现在给我这个错误: QueryException在Connection.php行729: SQLSTATE [42S22]:未找到列:1054'where子句'中的未知列'tags.post_id'(SQL:select * from'tags' where'标签'.'post_id' = 1和'tags'.'post_id'不为空) –

+0

您应该使用'belongsToMany'方法查看更新回答 – follio

+0

谢谢@Follio。建议的更改对我有效。 –