laravel 5.3 多对多关系 returns 仅在查询时关联角色

laravel 5.3 Many-to-Many relationship returns associated Role only when queried

我只是对它的工作原理感到困惑。

我在用户和角色之间有 M-M 关系。如果我像下面这样检索我的用户:-

 $user = Auth::User();//->with('roles')->get();

        $roleName = $user->roles[0]->name;

        return $this->sendResponse('User retrieved successfully',$user);

我收到以下回复:

{
  "success": true,
  "message": "User retrieved successfully",
  "data": {
    "id": 2,
    "name": "dummy",
    "email": "dummy@dummy.com",
    "created_at": "2017-05-06 09:49:50",
    "updated_at": "2017-05-06 09:49:50",
    "tenant_id": 2,
    "roles": [
      {
        "id": 1,
        "created_at": "2017-05-06 06:26:55",
        "updated_at": "2017-05-06 06:26:55",
        "name": "Admin",
        "permissions": null,
        "pivot": {
          "user_id": 2,
          "role_id": 1
        }
      }
    ]
  }
}

但是,如果我将我的用户检索为:-

$user = Auth::User();//->with('roles')->get();



        return $this->sendResponse('User retrieved successfully',$user);

我得到以下结果:-

{
  "success": true,
  "message": "User retrieved successfully",
  "data": {
    "id": 2,
    "name": "Ali",
    "email": "ali@and-or.com",
    "created_at": "2017-05-06 09:49:50",
    "updated_at": "2017-05-06 09:49:50",
    "tenant_id": 2
  }
}

为什么会这样?我希望 "first" 将结果发布到后一个查询。

其次,我在第一个查询后没有修改$user "method" 它是如何获得其角色附件的?

我确定有解释,但我无法确定。

检索模型时,在这种情况下,User 不会自动检索关系(因为在数据库端,这需要第二次查询,而您甚至可能不需要 roles在某种情况下)。

在您的第一个示例中,通过 $roleName = $user->roles[0]->name; 访问角色,Laravel 自动执行 roles() 查询,并将角色对象添加到 User (因此可以在以后再次访问它而无需重做查询)。这解释了为什么在第一个示例中角色 'magically' 附加到您的 User 模型。

在您的第二个示例中,此查询不会自动完成,因此您不会在响应中获得 roles 关系。

如果您想访问 Users 角色,那么您可以像在您的评论中那样使用 with() 方法来预先加载关系,但请记住,这意味着做第二个查询是为了从数据库中获取此数据。

另一种选择,如果您总是希望User模型附加其Roles,则将roles添加到$appends 模型数组:

protected $appends = ['roles'];

这告诉 Laravel roles 属性是您始终希望在您的模型上可用的属性,然后它会执行必要的操作以实现这一点(在这种情况下,查询关系).