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

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

经过大量的测试,我们去获取各类型表单的值 比如 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

### 回答1: 关于您的问题,我可以给出回答。在使用 Hibernate 时,当将字段设置为字符串时,Hibernate 会将该字段插入数据库,但是该字段的值将变为 NULL。这是因为在数据库字符串NULL 值是不同的概念,字符串表示该字段有值但为,而 NULL 表示该字段没有值。如果您希望将字符串保存数据库而不是变为 NULL,可以使用 Hibernate 的 @Column 注解的 nullable 属性设置为 false,如下所示: @Column(nullable = false) private String yourFieldName; 这将强制 Hibernate 将字符串插入到数据库。 ### 回答2: 在使用Hibernate进行数据插入时,如果将字段设置为字符串,并且这个字段在数据库的表结构不允许为(即设置了NOT NULL约束),那么Hibernate会将该字段的值插入为NULL。 这是因为Hibernate遵循数据库的约束规则,在某些数据库,将字符串插入到不允许为的字段会导致异常。为了避免这种情况,Hibernate会自动将字符串转换为NULL来符合数据库的约束规则。 如果开发者想要将字符串插入到数据库的某个字段,可以考虑以下两种方法: 1. 更改数据库表结构:将对应字段的约束改为允许为,这样就可以插入字符串了。 2. 使用自定义的setter方法:在实体类添加一个setter方法,在方法体判断,如果传入参数为null字符串,则将其设置为一个自定义的值(例如""),这样就可以将字符串插入到数据库了。 总之,使用Hibernate时,当字段设置为字符串,但数据库表结构不允许为时,Hibernate会将其插入为NULL,为了避免这种情况,可以修改表结构或自定义setter方法进行处理。 ### 回答3: 在使用Hibernate时,当将字段设置为字符串并尝试插入数据库时,该字符串会被转换为NULL值。 这是因为Hibernate通过间极小的Sequence Generator来判断实体是否有自动生成的主键。当字段被设置为为字符串时,Hibernate会将其内部的字符串数据处理为,因此在插入数据库时会将其转换为NULL。 为了避免将字符串转换为NULL值,我们可以通过在实体的属性上设置注解来解决此问题。我们可以使用@NotEmpty注解来确保字段不为字符串,例如: ``` @Entity public class ExampleEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotEmpty private String field; // 省略 getter 和 setter 方法 } ``` 通过将@NotEmpty注解添加到字段上,Hibernate将不允许将该字段设置为字符串,并在插入时验证注解的条件,如果字段为字符串,将抛出异常。 另外,可以考虑使用@NotBlank注解来确保字段既不为字符串也不为字符串,并且还可以使用@Column(nullable = false)来在数据库层面上强制该字段不为。 综上所述,使用Hibernate时,当字段被设置为字符串并插入数据库时,会被转换为NULL值。我们可以通过标记注解来限制字段不为字符串,从而避免将其转换为NULL值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值