[英]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.