【问题标题】:laravel model accessors not working in laravel 5.8laravel 模型访问器在 laravel 5.8 中不起作用
【发布时间】:2019-09-23 17:48:24
【问题描述】:

使用 User::find(1) 时属性(本例中为全名)不显示; (实际上返回一个用户实例)和访问器内部的 dd("test") 也不会被调用

我已经使用 tinker 对模型进行了 dd,并且我尝试在 $request->user() 输出上使用 dd 返回相同。

class User extends Authenticatable
{
    use Notifiable,HasApiTokens;


    protected $hidden = [
       'id',
        'master_password',
        'remember_token',
        'provider',
        'provider_id',
        'created_at',
        'updated_at',
        'deleted_at'
    ];

    public function getFullNameAttribute()
    {
        dd("test");
        return "test";
    }

}

我希望字段 full_name 的用户属性返回“test”。 (如果你让 dd 进来,那就是转储和死亡。)

【问题讨论】:

  • 您实际上必须通过$user->full_name 调用访问器;目前,它只是一个函数,并且在明确告知之前通常不会调用函数。或者,将其添加到 $appends 属性:protected $appends = ["full_name"];
  • 这不保护 $appends = ['test'];公共函数getTestAttribute(){返回“测试”; } 它仍然在我的属性中显示没有测试字段
  • 这可能只是在转换为json 时使用。没什么大不了的。 $user->full_name(或$user->test)会触发它吗?这是评论的重点。
  • 是的,但它没有显示我需要的属性
  • 什么意思?如果它显示"test",它可以工作...如果您需要该属性,可以通过$user->full_name; 获得它有什么问题?您可能需要展示您如何使用$user;你把它传递给一个视图吗?通过 api 发送?

标签: php laravel accessor


【解决方案1】:

根据 laravel 文档:

一旦属性被添加到附加列表中,它将被包含在模型的数组和 JSON 表单中。 appends 数组中的属性也将尊重模型上配置的可见和隐藏设置。

在您调用toArray() 或toJson() 函数之前,test 属性不会出现在$attributes 中。

User 实例属性数组不是 User 类的数组表示形式。

如果您正在使用User 对象,那么您可以使用 $user->test 获取访问器属性。

如果您想要 User 对象的数组或 json 表示,则将其返回为数组/json $user->toArray() 或 $user->toJson() - 现在包含在 $appends 数组中的访问器将自动包含在内。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    只需将其放入您的模型中即可:

    protected $appends = ['full_name'];
    

    默认情况下,它会调用您的 getFullNameAttribute 并添加它。它是专门为 api 构建而引入的。

    【讨论】:

      猜你喜欢
      • 2020-12-13
      • 1970-01-01
      • 2020-02-19
      • 2019-09-18
      • 2019-09-20
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多