关于Laravel为什么将空字符串转成null
字段分为必填和选填,对于选填的就是有可能有,有可能没有。要确认的是,不管用户填不填写,而前端都会传递这个字段过来。只不过该字段可能为‘’空字符串或为有值。所以不同的情况下,会导致错误。
我们确定了,无论如何,前端都会将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’ |