我注意到,在Laravel中,(当使用$model->fill(Input::all())
时,并不重要的是数据是如何进入的),空字段(表单中为空)以空字符串形式出现({ {1}})。这是有道理的,因为它是如何从浏览器传递到HTTP服务器到PHP的。
问题是,如果列是数字且值''
,或DEFAULT
能够,则Eloquent生成的查询的列值为NULL
所以MySQL解释并输入值''
而不是默认列值或0
。这是我在这里做错了什么,还是我需要额外的工作(例如一个mutator)来检测这个空字符串并转换为NULL
来实现我真正想要的东西?
当然,我理解从技术角度来看,Laravel在不知道列如何工作的情况下,不能假设空字符串意味着将null
传递给NULL
查询,因为有时你实际上想要将一个字段(特别是一个基于字符的字段)设置为空字符串而不是INSERT
。
那就是说,我不是因为我使用NULL
而不必为我的所有模型定义变换器,但有什么我不知道我可以办?
对于阅读此内容的MySQL人员 - 如果传递$model->fill()
,将数字字段设置为0
是否正确?似乎它应该被视为''
,因为它没有明确NULL
,但我想它可能是弱类型等同0
到''
而是而不是更远的0
。
答案 0 :(得分:2)
有一种非常简单的方法,即使用array_filter
。
$input = array_filter(Input::all(), 'strlen');
$model->fill($input);
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?' |
+---------+------+-------------------------------------------+
答案 1 :(得分:0)
要在某些字段上插入默认值,请不要显式设置这些字段的值。
收到表单数据时,请处理每个字段并确定要插入默认值中的哪些字段。然后将它们从插入到语句中删除。
示例强>:
表单字段:field1_1
,field_2
。
如果为它们提供了有效的输入,那么你可以编写sql语句,如:
insert into my_table values( field_1_value, field_2_value );
如果其中一个字段(例如field_2
)没有有效输入,您仍希望记录进入数据库表。然后编写sql语句,如:
insert into my_table( field_1 ) values( field_1_value );
执行此操作时,SQL引擎将使用insert语句中省略字段上定义的默认值。
注意:仅当您在数据库表中创建或更改列时在列上设置 default someValue 时,此方法才有效。