【问题标题】:Laravel belongsTo and hasMany relationship on same modelLaravel 的 belongsTo 和 hasMany 关系在同一个模型上
【发布时间】:2015-09-20 17:45:53
【问题描述】:

如何在同一模型上应用 belongsTo 和 hasMany 关系?

例如,我有一个用户和一个项目模型。现在 Project 模型有方法 user() 和 User 模型有 projects() 方法。

现在我希望一个用户与其他用户共享项目。这样我就可以在 Project 模型中拥有 users() 和在 User 模型中拥有 shared_projects() 等方法。

我怎样才能做到这一点?

这是我当前的项目模型

class Project extends \Eloquent {
    protected $fillable = [];

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

这是我的用户模型

class Project extends \Eloquent {
    protected $fillable = [];

    public function projects() {
        return $this->hasMany('Project');
    }
}

【问题讨论】:

  • 你的表结构是什么样的?
  • projects 表有 'id'、'project_name'、'user_id' 而 users 表有 'id'、'username'、'password'

标签: laravel


【解决方案1】:

在这种情况下,用户和项目具有多对多关系,因为一个用户有多个项目,一个项目属于多个用户。因此,您应该创建第三个表(project_user),连接数据库中的 User 表和 Project 表。 您将Many-to-Many relation 设置为用户模型和项目模型。

class User extends Eloquent {

public function projects()
{
    return $this->belongsToMany('Project');
}

}

在项目模型中

class Project extends Eloquent {

public function users()
{
    return $this->belongsToMany('User');
}

}

然后你可以做这样的事情

//users in the same project
$users = Project::find($id)->users;

【讨论】:

  • 嘿,谢谢,但这样做我会失去用户模型中项目方法的 hasMany 关系。
  • 现在,在两个模型中使用belongsToMany 关系
  • 它工作伙伴,看到我的答案缺少元素是更改方法名称并传递“foreign_key”。
【解决方案2】:

好的,这就是我解决它的方法。我按照您的建议使用了数据透视表,但我什至以这种方式添加了 hasMany 关系。我仍然不确定我在做什么是完全正确的,但它确实有效。 :)

class Project extends \Eloquent {
    protected $fillable = [];

    public function users() {
        return $this->belongsToMany('User');
    }

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

这是用户模型的关键要素

class User extends \Eloquent {
    protected $fillable = [];

    public function projects_owned() {
        return $this->hasMany('Project', 'user_id');
    }

    public function projects() {
        return $this->belongsToMany('Project');
    }
}

【讨论】:

  • 还有另一种方法。您可以在 project_user 表中创建一个新列,例如 ( onwer BOOL) 并使用 where('owner',true) 检索拥有该项目的用户
  • 是的,但是我尝试了我的方法并且工作得很好,不过感谢您的建议,请记住这一点。 :)
猜你喜欢
  • 2017-05-31
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 2017-01-03
相关资源
最近更新 更多