Eloquent $附加行为奇怪地在laravel 5.3中

时间:2017-01-30 20:37:14

标签: laravel

我只是想在json响应中包含一个新属性,但由于某些原因我也得到了对象关系。

// user model
protected $guarded = ['id'];
protected $appends = ['role_name'];
protected $hidden  = ['remember_token', 'password'];

public function getRoleNameAttribute()
{
    return $this->role->type;
}

public function role()
{
    return $this->belongsTo(Role::class);
} 

// role model
public function users()
{
    return $this->hasMany(User::class);
}

当我使用dd($user);时,我得到了

User {#303
  #guarded: array:1 [
    0 => "id"
  ]
  #appends: array:1 [
    0 => "role_name"
  ]
  #hidden: array:2 [
    0 => "remember_token"
    1 => "password"
  ]
  #connection: null
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  #perPage: 15
  +incrementing: true
  +timestamps: true
  #attributes: array:7 [
    "name" => "testing"
    "email" => "email@asd.com"
    "password" => "$2y$10$fogQXhJZm5eoViM38pge1.BmNxY7IFl515zT83.Ks9Uj26kK9T6Im"
    "role_id" => "83eee2e0-8939-48f7-9fbc-1c077e2265e5"
    "id" => "a181fb4b-b65a-47b4-9c72-21ea15c6c5a6"
    "updated_at" => "2017-01-30 20:23:52"
    "created_at" => "2017-01-30 20:23:52"
  ]
  #original: array:7 [
    "name" => "testing"
    "email" => "email@asd.com"
    "password" => "$2y$10$fogQXhJZm5eoViM38pge1.BmNxY7IFl515zT83.Ks9Uj26kK9T6Im"
    "role_id" => "83eee2e0-8939-48f7-9fbc-1c077e2265e5"
    "id" => "a181fb4b-b65a-47b4-9c72-21ea15c6c5a6"
    "updated_at" => "2017-01-30 20:23:52"
    "created_at" => "2017-01-30 20:23:52"
  ]
  ...
}

并使用return response()->json(compact('user'));而不是

user: {
    created_at: "2017-01-30 20:26:12"
    email:"email@asd.com"
    id:"4b83e031-e8c8-4050-963d-446cb383fb14"
    name:"testing"
    role:{
        created_at:"2016-12-29 10:54:02"
        id:"83eee2e0-8939-48f7-9fbc-1c077e2265e5"
        type:"user"
        updated_at:"2016-12-29 10:54:02"
    }
    role_id:"83eee2e0-8939-48f7-9fbc-1c077e2265e5"
    role_name:"user"
    updated_at:"2017-01-30 20:26:12"
}

但我期望只有

user: {
    created_at: "2017-01-30 20:26:12"
    email:"email@asd.com"
    id:"4b83e031-e8c8-4050-963d-446cb383fb14"
    name:"testing"
    role_id:"83eee2e0-8939-48f7-9fbc-1c077e2265e5"
    role_name:"user"
    updated_at:"2017-01-30 20:26:12"
}

所以我不确定这是正常行为还是错误,或者可能遗漏了什么?

  • Laravel版本5.3.30

1 个答案:

答案 0 :(得分:2)

发生这种情况的原因如下:

public function getRoleNameAttribute()
{
    return $this->role->type;
}

这里的问题是当你说$this->role它会自动将关系附加到模型时。为了防止这种情况,您应该只能直接访问该方法,例如$this->role()

public function getRoleNameAttribute()
{
    return $this->role()->first()->type;
}