关于Laravel为什么将空字符串转成null

4 个月前 · 来自专栏 程序人生

字段分为必填和选填,对于选填的就是有可能有,有可能没有。要确认的是,不管用户填不填写,而前端都会传递这个字段过来。只不过该字段可能为‘’空字符串或为有值。所以不同的情况下,会导致错误。

我们确定了,无论如何,前端都会将key传递过来,只不过有值和无值的问题,所以和数据库默认值是无关的,这里讨论,默认值只有在压根不写入的时候,才会触发。所以下面的问题,基本上就是类型不同导致的问题。

前端 后端需要类型(key=有值) 后端需要类型 (key=不传值) 后端需要类型 (key=不传值)
'abcd' string ‘abcd’ ' '
1 int 1 给个默认值(都是客户暂时不填,也是不要的默认值)
1.1 double 1.1 给个默认值(都是客户暂时不填,也是不要的默认值)
Y-m-d’ deatetime ‘Y-m-d’ 给个默认值(都是客户暂时不填,也是不要的默认值)

说明一:字段必传,但是值可能填或不填,填了符合预期,不填,也让他用户不填给个符合预期的默认值,写进去。但程序可能要做处理。

说明二: 字段必传,用于不填,用户也不给值,那么你会发现上面空着很多部分,string类型的不填,可以是空字符串,int类型的不填该是啥?double类型的不填该是啥?,严格意义来讲什么都没有,那么就是null。 所以laravel将不填的字段处理为null,正式这个原因。

说明三:字段不填,上面有4种类型,小数整型、或日期,在实际开发中,前端可能都是给的字符串类型的1,字符串类型的1.1 ,字符串类型的 时间戳,这个是直接从input输入框.value获取的。所以他们的前端不传值其实都是空字符串。而实际上前端也就是通过这种方式传过来的,所以laravel也正是靠着这个特性才能有处理成null的做法。这个是按照上面的推理比较规范化的操作。只不过如果未null的情况,在添加的时候(数据库有默认值情况下)就要去除这些每填的null。在修改的话,客户删除部分必填字段,结果为null,所以这些null还要转换成空字符串,意思就是删除,或者转换成特定的值,才行。

这个就是使用标准null,在增加中就要删除去null,前提数据库中都有默认值,在修改中,一些字段要转空。

前端 后端需要类型(key=有值) 后端需要类型 (key=不传值) 后端需要类型 (key=不传值)
'abcd' string ‘abcd’ ' '
1 int 1 '' 给个默认值(都是客户暂时不填,也是不要的默认值)
1.1 double 1.1 '' 给个默认值(都是客户暂时不填,也是不要的默认值)
Y-m-d’ deatetime ‘Y-m-d’ '' 给个默认值(都是客户暂时不填,也是不要的默认值)

上面这张图,就是实际的,前端无论是int double 还是string,都用string传递,不传都为空字符串(laravel底层原理)。我也不要框架底层把这种形式转换成null了,如果前端同时按照严格执行的类型,也不用默认值的话,那么没办法表示,只能用空字符串。 没填就是空字符串,我也不要默认值了。

string传值 不传为 ' ' 增修都如下

传递值 传值 不传值
varchar default ‘’ 不处理 不处理
tinyint default 0 不处理 处理,也可能自动转换
datetime defalut '20122' 不处理 处理

如果 string传值 不传为 null

添加:

传递值 传值 不传值
varchar default ‘’ 不处理 处理,数据库不为null,要么不要,有默认值,要么修改成''
tinyint default 0 不处理 处理,数据库不为null,要么不要,有默认值,要么修改成默认值0
datetime defalut '20122' 不处理 处理,数据库不为null,要么不要,有默认值,要么修改成默认值‘1970-01-01’

修改

传递值 传值 不传值
varchar default ‘’ 不处理 处理,数据库不为null,要么修改成''
tinyint default 0 不处理 处理,数据库不为null,要么修改成默认值0
datetime defalut '20122' 不处理 处理,数据库不为null,处理么修改成默认值‘1970-01-01’
发布于 2022-12-05 15:47 ・IP 属地江苏

文章被以下专栏收录

    程序人生

    程序人生