【问题标题】:laravel model relations for forum论坛的laravel模型关系
【发布时间】:2014-04-18 08:44:08
【问题描述】:

我目前正在 Laravel 中创建一个论坛,只是为了学习,但我无法让我的关系很好地运作。

我有一个线程、帖子和用户模型。

我尝试了以下方法:

class User {
    public function thread() {
        return $this->hasMany('Thread');
    }

    public function post() {
        return $this->hasManyThrough('Thread', 'Post');
    }
}


class Thread {

    public function post() {
        return $this->hasMany('Post');
    }

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

class Post {

     public function thread() {
        return $this->belongsTo('Thread');
     }

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

通过这种方法,我可以获得一个特定的线程,以及属于它的帖子。但我无法抓住在线程中发布帖子的用户。

我希望我的问题对你来说足够清楚。任何帮助将不胜感激。

【问题讨论】:

    标签: php orm laravel eloquent


    【解决方案1】:

    为了清楚起见,我建议你将你的关系命名为 hasOne/belongsTo 的单数,belongsToMany/hasMany 的复数

    因此用户和线程将是:

    public function posts() ...
    

    现在,这是错误的顺序:

    class User {
      public function posts() {
        // return $this->hasManyThrough('Thread', 'Post'); // wrong, change to:
        return $this->hasManyThrough('Post', 'Thread');
      }
    }
    

    除了你的关系看起来不错,所以你应该能够做到这一点:

    $thread = Thread::with('posts.user')->find($threadId); // eager load relations
    $thread->posts; // Eloquent Collection of Post models
    foreach ($thread->posts as $post)
    {
      $post->user; // author's User model
    }
    

    顺便说一句,您可以随时查看 Laravel.io 源:https://github.com/LaravelIO/laravel.io/

    【讨论】:

    • 非常感谢您的回复!它现在工作得更好了。我只忘了一件事。我有一个 threads usersposts 表。在posts表中,我只放了user_id,我想从users表中获取对应那个user_id的用户名。
    • 没错,然后在我写的那个循环中,你可以像这样访问用户名 $post->user->username;
    • 当我尝试这样做时,我收到“尝试获取非对象的属性”错误。当我像 $post->user()->username 一样访问它时,我得到“未定义的属性:Illuminate\Database\Eloquent\Relations\BelongsTo::$username”。
    • 没关系,我发现了我的错误。我没有指定要在我的 Post 模型中查看的本地密钥。 public function userr() { return $this->belongsTo('User', 'user'); } user_id 列被命名为“用户”。这就是问题
    • 因此您在 db 中没有相关用户,或者该帖子根本没有 user_id 值,并且 $post->user 返回 null。用户 PK 也称为 'id' 吗?
    猜你喜欢
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2019-04-04
    相关资源
    最近更新 更多