Laravel使用同一张表定义多对多关系

时间:2018-07-27 06:16:13

标签: laravel eloquent many-to-many laravel-5.6

因此,我有一个posts表和一个相应的Post模型。我希望每个帖子都有相关的帖子。由于帖子可以包含许多其他相关帖子,因此posts表和posts表(同一表)之间是多对多的关系。

因此,我创建了一个related_posts数据透视表及其相应的模型RelatedPost。我想在两个模型中定义这种关系。像这样:

发布模型:

public function related()
{
 return $this->belongsToMany(RelatedPost::class, 'related_posts', 'related_id', 'post_id');
}

相关帖子模型:

public function posts()
{
  return $this->belongsToMany(Post::class, 'related_posts', 'post_id', 'related_id');
}

现在,在选择特定帖子后,在我的帖子控制器中,我想获取所有与其相关的帖子。所以我这样做:

$post->related()->get();

但是当我这样做时,我收到以下错误消息:

  

“ SQLSTATE [42000]:语法错误或访问冲突:1066不是唯一的表/别名:'related_posts'(SQL:选择related_posts。*,related_postsrelated_id作为{ {1}},pivot_related_idrelated_posts为{{1}上post_id内部联接pivot_post_id的{​​{1}}。related_posts = {{ 1}}。related_posts,其中related_postsid = 1)“

这是我对数据透视表的迁移:

related_posts

我到处搜索,尽管找到的解决方案确实很有意义,但我无法让其中任何一个发挥作用。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

感谢@ d3jn对我的问题的评论,我得以解决我的问题。因此,我将解决方案发布在这里,以防万一其他人可能需要它。

我将Post模型与其自身相关,而不与枢纽模型RelatedPost相关。因此,我不需要RelatedPost模型。我只需要数据透视表(related_post),关系的idrelated_idpost_id

因此,在保持迁移不变的情况下,我只需要取消RelatedPost模型,并在related()模型中更改我的Post方法,如下所示:

public function related()
{
  return $this->belongsToMany(Post::class, 'related_posts', 'post_id', 'related_id');
}

现在一切正常。