使用 Laravel Request 在更新方法上传递空字段

问题描述 投票:0回答:4

我正在通过经典提交的表单获取数据,但由于某种原因,我没有获取请求中的所有输入数据,它只更新收到的数据。

Model::find($id)->update($request->all());

这有点问题,因为我的数据库中有多个可为空的字段,有时我想传递空字段(即当用户清除输入然后提交表单时)

您是否知道一种将空字段传递给请求的方法?

php laravel forms request submit
4个回答
4
投票

问题是,Laravel 默认通过

ConvertEmptyStringsToNull
中间件将
''
值转换为 null。检查你的内核:

应用程序/Http/Kernel.php

protected $middleware = [
    // ...
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    // ...
];

该中间件执行以下操作:

protected function transform($key, $value)
{
    return is_string($value) && $value === '' ? null : $value;
}

如您所见,如果给定属性具有值

''
,它将转换为
null

因此,为了避免这种情况,您可以在内核文件中注释该中间件。但请注意这一点,因为这将应用于您的整个应用程序。


1
投票

输入修剪和标准化
Laravel 版本 > 5.4 已经包含以下功能:


对于版本< 5.4:使用以下代码创建一个新的中间件:

public function handle($request, Closure $next)
{
    foreach ($request->input() as $key => $value) {
        if (! $value) {
            $request->request->set($key, NULL);
        }
    }

    return $next($request);
}

并将其分配给您希望其发生的路由或控制器方法:

Route::post('/route/{id}', [
   'middleware' => NewMiddleware::class,
], function (Request $request, $id) {
    Model::find($id)->update($request->all());
});

记住:

create()
update()
等方法适用于模型中
$fillable
数组中的字段:

class User extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['name', 'email', 'contact', ];
}

或者,如果您想排除某些字段并包含其余字段,请使用

$guarded
数组代替:

class User extends Model
{
    /**
     * The attributes that aren't mass assignable.
     *
     * @var array
     */
    protected $guarded = ['details'];
}

如果您的字段不在“Model”类中的

$fillable
数组中,则
update()
方法将不适用于该字段!!!

参考:批量作业


0
投票

你可以使用 php

array_merge()
就像我使用的这段代码一样

$contentCategory->update(array_merge($request->all(), ["FIELD1" => '',"FIELD2" => '']));

或测试此代码:

$request->request->add(['FIELD1' => '','FIELD2' => '']);

0
投票

我设法让它工作:在我的网络应用程序上,我禁用了 ConvertEmptyStringsToNull 中间件(对其进行了注释),因此当我记录

$request
时,我得到空值
''
并在 API 上,
$request
记录
null
值对于每个字段。

© www.soinside.com 2019 - 2024. All rights reserved.