gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:08:11 25 4
gpt4 key购买 nike

我注意到,在 Laravel 中,(当使用 $model->fill(Input::all()) 时,数据的输入方式并不重要),空字段(在表单中为空)作为空字符串 ('') 出现。这是有道理的,因为这就是它从浏览器传送到 HTTP 服务器再到 PHP 的方式。

问题是,如果该列是数字并且有一个 DEFAULT 值,或者是 NULLable,Eloquent 生成的查询有 '' 用于列的值,因此 MySQL 将其解释为 0 而不是默认列值或 NULL。是我在这里做错了什么,还是我需要做额外的工作(例如,一个增变器)来检测这个空字符串并转换为 null 以实现我真正想要的?

当然我明白,从技术的角度来看,Laravel 在不知道你的列是如何工作的情况下,不能假设空字符串意味着将 NULL 传递给 INSERT 查询,因为有时您实际上想将字段(特别是基于字符的字段)设置为空字符串而不是 NULL

就是说,我宁愿不必仅仅因为我正在使用 $model->fill() 就为我的所有模型定义修改器,但是有什么我不知道的吗我能做什么?


对于阅读本文的 MySQL 用户 - 如果通过 '',将数字字段设置为 0 是否正确?似乎它应该被视为 NULL,因为它不是明确的 0,但我猜它可能是弱类型,将 '' 等同于 0 而不是更远的 NULL

最佳答案

有一种非常简单的方法可以做到这一点,那就是使用 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?' |
+---------+------+-------------------------------------------+

关于mysql - 让 Laravel 在插入/更新时使用 MySQL 默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22477680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com