Laravel 前台的空字符串保存到数据库中变成了 null怎么办

文章讨论了在Laravel框架中,由于全局中间件ConvertEmptyStringsToNull将空字符串转换为null的问题,这在处理数据库时可能会造成不便。作者提供了两种解决方案:直接注释掉中间件代码或自定义修改器和中间件,建议在不影响框架稳定性的情况下谨慎操作。另外,文章还提及了PHP的array_filter函数作为数据过滤的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过大量的测试,我们去获取各类型表单的值 比如 text、password、radio 复选框 textara 还有 双标签中的text值,实际上,如果不填写console.log() 获取的值都是空字符串,但是打印出来在浏览器上是啥也没有。

ee17ee242c269e12f452a438fa63bea0.png

这个是正常的,但是传给后端却变成了null ,其实前端传过去的就是空字符串,上图那样,只是后端一般 是java或者是php框架,对了进行处理,将空字串转换为null,这个在我们操作数据库是不方便的,为什么变成null,因为字符串是对象,空字符串就是空对象。

以php的laravel为例

框架源码中:

laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php
2db2f45d27b7c4eb798ed7cdadf7048c.jpeg

框架底层的代码意思,如果是空字符串那么就转换为null,所以这不是前端是否对参数序列化和特殊处理的问题,而是后端需要做的改变。

解决方法:

  1. 暴力一点,直接注释这行,直接返回$value 不要做处理;(慎用)

    class ConvertEmptyStringsToNull extends TransformsRequest
    {
        /**
         * Transform the given value.
         *
         * @param  string  $key
         * @param  mixed  $value
         * @return mixed
         */
        protected function transform($key, $value)
        {
    //        return is_string($value) && $value === '' ? null : $value;
            return $value;
        }
    }

但是这样还是很暴力的,毕竟框架底层代码,非常不建议这样操作,则会个文件,在laravel全局中间件文件中,已经引入的,也就是改文件是通过注册全局中间件加载的,所以在全局中间件那边也可以注释掉中间件配置,一样有效果。

5491808132c610838b0a7daa6064b7c8.jpeg

我们可以看到上面还有一个trimstrings 中间件 这个中间件也是处理字符串用的,只不过他用于去除字符串两边的空格。

2.解决这个方法还有其他办法:

自己针对传的字段这些修改器或者自己定义中间件也可以解决,或者是request validate 但是很多表单字段很多,所以真的很麻烦。所以冒个风险 注释了中间件,因为是对参数做处理嘛,在laravel5.1版本都没有这个功能,所以注释了应该问题不大。

3.php中有个方法,过滤参数中的值

<?php
function test_odd($var)
{
return($var & 1);
}

$a1=array("a","b",2,3,4);
print_r(array_filter($a1,"test_odd"));
?>

其实这应该是laravel规范数据做的处理而已。可能规范,但并不符合我们实际期望。若可以框架实现自我配置文件就更加好了,因为我们也不愿意动框架原生的东西。

在开发过程中发现前端的 input 内容为空时,保存到数据库中却变成了 null ,看了一下 Laravel 的文档,才发现 Laravel 默认启用了一个全局中间件: \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,顾名思义就是将空字符串转成 null ,我们关掉这个全局中间件就可以了。

在 app/Http/Kernel.php 文件中注释掉 ConvertEmptyStringsToNull 中间件即可。

ab41ec8c5a83e0ae99e824972261bddf.jpeg

47b6a46086bbaa4ce74059b2821413a8.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值