ale*_*ell 5 mysql laravel eloquent laravel-4
我注意到,在Laravel中,(当使用时$model->fill(Input::all())
,并不重要的是数据是如何进入的),空字段(表单中为空''
)以空字符串()形式出现.这是有道理的,因为它是从浏览器传递到HTTP服务器到PHP的方式.
问题是,如果列是数字并且具有DEFAULT
值,或者NULL
能够,则Eloquent生成的查询具有''
列的值,因此MySQL将其解释并输入值0
而不是默认列值或NULL
.这是我在这里做错了什么,还是我需要额外的工作(例如一个mutator)来检测这个空字符串并转换null
为实现我真正想要的东西?
当然我理解从技术角度来看,Laravel在不知道列如何工作的情况下,不能只假设空字符串意味着传递NULL
给INSERT
查询,因为有时你实际上想要设置一个字段(特别是基于字符的字段)一)空字符串而不是NULL
.
也就是说,我宁愿不必为我所有的模型定义变换器只是因为我正在使用$model->fill()
,但有什么我不知道我能做什么吗?
对于阅读此内容的MySQL人员 - 0
如果传递了数字字段,是否正确''
?似乎应该被看作是NULL
因为它没有明确0
的,但我想这也许弱类型等同''
于0
而不是更远NULL
.
有一个非常简单的方法可以做到这一点,那就是使用array_filter
.
$input = array_filter(Input::all(), 'strlen');
$model->fill($input);
Run Code Online (Sandbox Code Playgroud)
array_filter 将返回所有分配了某些内容的键。
此解决方案有一些注意事项:
strlen
已经使用过,并且没有empty
。这是因为empty
会导致其他项目(例如数字 0)也被取消设置。编辑:至于MySQL问题,是的,这是正常的。
mysql> SELECT CAST("tim?" AS SIGNED);
+------------------------+
| CAST("tim?" AS SIGNED) |
+------------------------+
| 0 |
+------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'tim?' |
+---------+------+-------------------------------------------+
Run Code Online (Sandbox Code Playgroud)