繁体   English   中英

更新 Laravel 模型中的不可填充字段

[英]Update non-fillable field in Laravel Model

我有我的 User 表,当你完成整个php artisan make:auth内容时,默认表 laravel 附带,我添加了一个布尔system_admin列,以及其他几个类似的列

现在,当有人注册到该站点时,我不希望恶意的人能够给自己这个权利,所以我没有将该字段放在 User.php 模型文件的fillable数组中。

那么第一个问题是:出于正确的原因,这是正确的决定吗?

但是现在我正在处理一个系统管理页面,它应该允许人们修改这样的属性,但在我的路线中,只有系统管理员才能访问,我的代码如下所示:

public function updateUser($userId, Request $request) {
        $user = User::find($userId);
        $update = $request->all();
        $user->update($update);

当然,由于这些列不可fillable ,因此此请求不适用于这些字段。

但我想要它,因为这个特定的路由受中间件保护,中间件验证 system_admin 应该有权访问它。

那么如何更新这些不可填充的列,而不允许非系统管理员更新相同的列呢?

我使用 lagbox answer 提出了一个替代解决方案,该解决方案遍历我路线中的每个更新变量键:

public function updateUser($userId, Request $request) {
    $user = User::find($userId);
    $update = $request->all();
    foreach($update as $key => $value) {
        $user->$key = $value;
    }
    $user->save();

    $newUser = User::find($userId);
    return response()->json($newUser->toJson());
}

我希望这样做没有任何问题。

我没有将该字段放在 User.php 模型文件的可填充数组中

是的,这是正确的决定,因为它要求您明确设置该值。 这就是说,它仍然可以在代码中明确设置(这可能是你想要的)。

那么如何更新这些不可填充的列,而不允许非系统管理员更新相同的列呢?

我不熟悉update()方法。 此外,通常情况下,Laravel 使用称为路由绑定的东西,它根据路由自动初始化控制器中的对象(但这对您的问题并不重要)。

您的控制器代码应如下所示:

public function update(Request $request)
{
    $user = User::findOrFail($request->id);
    $user->fill($request->all());
    $user->system_admin = $request->system_admin;
    $user->save();
    …
}

请注意,除非您向 $fillable 添加字段,否则您必须指定要手动更新的每个字段(如图所示)。 循环遍历键是有问题的,因为可能存在不应该属于保存模型的一部分的各种字段。

由于您正在使用警卫(或类似的)来限制谁可以访问这些路由,因此使 system_admin 可填充应该不是问题。

HTH

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM