我正在通过经典提交的表单获取数据,但由于某种原因,我没有获取请求中的所有输入数据,它只更新收到的数据。
Model::find($id)->update($request->all());
这有点问题,因为我的数据库中有多个可为空的字段,有时我想传递空字段(即当用户清除输入然后提交表单时)
您是否知道一种将空字段传递给请求的方法?
问题是,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
。
因此,为了避免这种情况,您可以在内核文件中注释该中间件。但请注意这一点,因为这将应用于您的整个应用程序。
输入修剪和标准化
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()
方法将不适用于该字段!!!
参考:批量作业
你可以使用 php
array_merge()
就像我使用的这段代码一样
$contentCategory->update(array_merge($request->all(), ["FIELD1" => '',"FIELD2" => '']));
或测试此代码:
$request->request->add(['FIELD1' => '','FIELD2' => '']);
我设法让它工作:在我的网络应用程序上,我禁用了 ConvertEmptyStringsToNull 中间件(对其进行了注释),因此当我记录
$request
时,我得到空值 ''
并在 API 上,$request
记录 null
值对于每个字段。