如何以最“雄辩”的方式构建这种多对多关系?

时间:2016-10-19 04:04:14

标签: laravel eloquent

我可以想象一些方法可以做到这一点,但我想确保我正在以高效的Laravel方式做事。

我有用户和团队。用户可以属于许多团队,当然团队可以拥有许多用户。一个典型的多对多:

{
  "type": "apache_access",
  "clientip": "192.243.xxx.xxx",
  "verb": "GET",
  "request": "/publications/boreal:12345?direction=rtl&language=en",
  ...
  "url_path": "/publications/boreal:12345",
  "url_params": {
    "direction": "rtl",
    "language": "end"
  },
  "object_id": "boreal:12345",
  "author": [
    "Smith, John",
    "Dupont, Albert",
    "Reegan, Ronald"
  ],
  ...
}

和,

class User extends Authenticatable
{
    public function teams()
    {
        return $this->belongsToMany('App\Team');
    }
}

我还希望每个用户在每个团队中都有“状态”。例如,“有效”和“无效”。

我是否为“状态”创建了第三个表/模型,并为用户和团队设置了枢轴?如果是这样,我如何使用eloquent高效地为每个团队获取给定状态的用户?

我应该考虑采用不同的方法吗?

1 个答案:

答案 0 :(得分:3)

对于多对多,你显然需要一个中间表。 team_user不管怎样。您可以将status列添加到此表中。

team_id    user_id    status
1          1          Active
2          1          Inactive
....

<强>关系:

public function teams()
{
    return $this->belongsToMany('App\Team')->withPivot('status');
}
public function users()
{
    return $this->belongsToMany('App\User')->withPivot('status');
}

$users=User::with('teams')->get();
foreach($users as $user)
{
   foreach($user->teams as $team)
   {
        echo $team->pivot->status;
   }
}

以下是Working with pivot tables

的文档