请问 Laravel 框架为什么会选择将请求参数的空字符串转换为 null 呢?

protected $middleware = [
    .
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class
    .
];
class ConvertEmptyStringsToNull extends TransformsRequest
{
    protected function transform($key, $value)
    {
        return is_string($value) && $value === '' ? null : $value;
    }
}

现在因为这个中间件,框架会把请求参数空字符串自动转为 null,导致数据库保存报错。
我搜索了很多关于此点的回答大致解决方案有以下,但都没有回归到问题本质上面来。

  • 去掉这条中间件的注册
  • 在控制器中转换 $request->column ?: '';

为什么 Laravel 框架会选择将请求参数 空字符串 转换为 null 呢?
是否意味着框架鼓励我们将可选的数据库字段设置为 nullable?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

允许为空的数据字段更推荐设置为 nullable,Laravel 的数据库字段类型定义都是规范的。个人建议使用一个框架就去尽量遵守框架定义好的规范。
例如:
空字段可设置为null,空字符串等。Laravel 默认使用 null
时间字段可设置为时间戳,datetime,int 等。Laravel 默认使用时间戳

5年前 评论
讨论数量: 3

我也不喜欢这个中间件,在 Kernel 注释掉即可

file

5年前 评论
小民爱Laravel (楼主) 5年前
半人间 5年前

允许为空的数据字段更推荐设置为 nullable,Laravel 的数据库字段类型定义都是规范的。个人建议使用一个框架就去尽量遵守框架定义好的规范。
例如:
空字段可设置为null,空字符串等。Laravel 默认使用 null
时间字段可设置为时间戳,datetime,int 等。Laravel 默认使用时间戳

5年前 评论

@winter-ice 如果说Laravel为了规范提供 ConvertEmptyStringsToNull 中间件自动将空字符串转为 null ,那为什么Laravel Blueprint类 默认创建的字段都是not null ? 感觉有点乱

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!