使Laravel在插入/更新时使用MySQL默认值

时间:2014-03-18 11:14:02

标签: mysql laravel laravel-4 eloquent

我注意到,在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

2 个答案:

答案 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_1field_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 时,此方法才有效。