Laravel:为什么 Eloquent 显示隐藏字段?

Laravel: Why is Eloquent displaying hidden fields?

只需在字段名称前加上#前缀

我正在使用 Laravel Breeze,它默认将 passwordremember_token 字段设置为隐藏。

class User extends Authenticatable
{
    use HasFactory, Notifiable;

    protected $fillable = [
        'username',
        'email',
        'password',
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

但是,如果我在 Tinker 中获取一个 User 实例 运行 User::inRandomerOrder()->first(),我仍然能够看到这些假定的隐藏字段。

App\Models\User {#4440
 id: 14,
 username: "verdie10",
 email: "jerrold.ziemann@example.org",
 email_verified_at: "2021-08-31 11:19:47",
 #password: "yIXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi",
 #remember_token: "F87k6RPxgi",
 created_at: "2021-08-31 11:19:47",
 updated_at: "2021-08-31 11:19:47",
},

那是因为这些字段仅在您将模型转换为数组或 JSON 时隐藏。

来自文档:

Sometimes you may wish to limit the attributes, such as passwords, that are included in your model's array or JSON representation.

有关此主题的完整文档可在此处获取:https://laravel.com/docs/8.x/eloquent-serialization#hiding-attributes-from-json

我们的目标是将它们从您的 API 回复中删除。

但是,当您在控制器、服务中使用模型时,您可能仍会使用它们……这就是您看到它们的原因。

您可以通过以下方式检查它是否有效:

$user = User::first();
$user->toArray(); // hidden attributes not included
$user->toJson(); // hidden attributes not included

Laravel 文档:

隐藏数组的属性或JSON转换

所以,如果你尝试

get()->toArray();

它们将被隐藏。

测试:

dd(User::find(1)->toArray());
dd(User::find(1));

##############

User::find(1)->exclude(['password']);

##############

User::find(1)->makeHidden('password');

使用 makeHidden() 方法获取用户

User::inRandomerOrder()->first()->makeHidden(['password'])