【问题标题】:How do I link 3 models in laravel?如何在 laravel 中链接 3 个模型?
【发布时间】:2021-12-13 11:12:20
【问题描述】:

我有 3 张桌子。用户、帖子和评论。

一个用户和帖子链接在一起,因为一个用户可以有很多帖子,并且每次用户发帖时都会获取用户 ID。

评论表有用户ID和帖子ID。

用户可以有多个 cmets,一个帖子可以有多个 cmets。我试过用这个,但它说

Call to undefined method Illuminate\Database\Eloquent\Relations\BelongsToMany::associate()

这是我的链接代码。

CommentController 的存储方法:

public function store(Request $request)
    {
        $request->validate([
            'text'=>'required'
        ]);

        $comment = new Comment;
        $comment->text = $request->get('text');
        $comment->user()->associate($request->user());

        $comment->save();

        return redirect('/home');
    }

这是我的关系查询。在我的帖子模型中,我有这个:

public function comment()
    {
        return $this->hasMany(Comment::class);
    }

在我的用户模型中,我有这个:

public function comment()
    {
        return $this->hasMany(Comment::class);
    }

在我的评论模型中,我有这个:

public function user()
    {
        return $this->belongsToMany(User::class,Post::class);
    }

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 一条评论可能只与一个帖子和一个用户相关联,所以我认为没有必要同时链接它们。

标签: php laravel laravel-6


【解决方案1】:

您错误地使用了 belongsToMany() - 您不能以这种方式将它附加到多个模型,因为它期望的第二个参数(如果提供)是数据库表名。

每个评论,大概,belongsTo() 一个用户,belongsTo() 一个帖子,在这种情况下,它应该这样说 - 在你的评论模型中:

public function user() {
    return $this->belongsTo(User::class);
}

public function post() { 
    return $this->belongsTo(Post::class);
}

也没有 associate() 方法 - 我想您可能正在考虑 attach(),但这里没有必要,因为这是在 oneToMany / ManyToMany 关系中存在中间表的情况。在这种情况下,由于 Comment belongsTo() 是单个用户,那么您的 cmets 表只需要一个与 users 表有关系的 user_id 列,并且在您的 store() 方法中您可以:

$comment = new Comment;
$comment->text = $request->get('text');
$comment->user_id = $request->user()->id;
$comment->save();

【讨论】:

  • 我这样做了,每次发表评论时都会收到此错误此路线不支持 POST 方法。支持的方法:GET、HEAD。
  • 这与您的原始问题无关 - 检查您的路线文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 2014-03-21
相关资源
最近更新 更多