如何在雄辩中建立基于用户 - 账户 - 角色的关系

时间:2018-03-12 00:59:42

标签: php eloquent

我正在开发一个系统,我需要许多用户可以拥有多个帐户,并且每个帐户可以拥有多个角色。

如何以雄辩的方式进行设置。

我目前使用的是用户模型:

public function accounts() {
    return $this->belongsToMany('App\Models\Account');
}

public function roles() {
    return $this->belongsToMany('App\Models\Account')->withPivot('role');
}

我有一个数据透视表user_account,其中定义了角色。

我的问题是,当我去

$user = User::with('accounts')
                ->with('roles')
                ->where('id', $user['id'])
                ->first();

我的输出是:

{
  "id": 1,
  "name": "John Doe",
  "created_at": "2018-03-11 20:46:46",
  "updated_at": "2018-03-11 20:46:46",
  "accounts": [
    {
      "id": 1,
      "name": "Acme Inc",
      "type": "BUSINESS",
      "created_at": "2018-03-11 20:46:46",
      "updated_at": "2018-03-11 20:46:46",
      "pivot": {
        "user_id": 1,
        "account_id": 1
      }
    },
    {
      "id": 1,
      "name": "Acme Inc",
      "type": "BUSINESS",
      "created_at": "2018-03-11 20:46:46",
      "updated_at": "2018-03-11 20:46:46",
      "pivot": {
        "user_id": 1,
        "account_id": 1
      }
    }
  ],
  "roles": [
    {
      "id": 1,
      "name": "Acme Inc",
      "type": "BUSINESS",
      "created_at": "2018-03-11 20:46:46",
      "updated_at": "2018-03-11 20:46:46",
      "pivot": {
        "user_id": 1,
        "account_id": 1,
        "role": "SYSTEMADMINISTRATOR"
      }
    },
    {
      "id": 1,
      "name": "Acme Inc",
      "type": "BUSINESS",
      "created_at": "2018-03-11 20:46:46",
      "updated_at": "2018-03-11 20:46:46",
      "pivot": {
        "user_id": 1,
        "account_id": 1,
        "role": "USER"
      }
    }
  ]
}

我想要的是角色只包含来自数据透视表的数据,包含user_id,account_id和角色名称。有什么指针吗?我还希望帐户输出只包含一个帐户。

1 个答案:

答案 0 :(得分:0)

通过在网上广泛搜索,我实际上找到了一个解决方案。

您需要创建一个AccountUser模型并将该角色添加到account_user表。

在User类中设置这些关系:

public function roles() {
    return $this->hasMany('\App\Models\AccountUser');
}

public function accounts() {
    return $this->hasManyThrough('\App\Models\Account', '\App\Models\AccountUser', 'id', 'id');
}

在AccountUser类

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

public function account() {
    return $this->belongsTo('App\Models\Account');
}

在帐户类

public function accountUser() {
    return $this->hasMany('\App\Models\AccountUser');
}

现在我可以做到

$user = User::with('roles')
                ->with('accounts')
                ->where('email', $data['email'])
                ->first();

我得到了我预期的输出:)

希望这有助于某人...