【问题标题】:Laravel Carbon data missing when date is an empty string当日期为空字符串时,Laravel Carbon 数据丢失
【发布时间】:2017-10-14 11:59:32
【问题描述】:

在我的模型中,我有以下内容:

protected $dates = ['start_date'];

我正在使用“日期”类型的输入字段来选择日期。如果用户删除日期,其值将变为空字符串“”。 更新我的模型时,我收到以下错误:

exception: "InvalidArgumentException"
file: "C:\www\projects\crm\vendor\nesbot\carbon\src\Carbon\Carbon.php"
line: 582
message: "Data missing"

我可以通过使用这样的 mutator 来避免这个错误:

public function setStartDateAttribute($value)
{
    if ($value) {
        $this->attributes['start_date'] = $value;
    } else {
        $this->attributes['start_date'] = null;
    }
}

问题: 有没有比使用 mutator 更快/更好的方法来处理将空字符串存储为日期?

【问题讨论】:

  • 你在某处使用Carbon::createFromFormat($format, $time, $tz);吗?
  • 我没有明确使用它,但是 Laravel 在将字段设置为日期时会使用它(laravel.com/docs/5.5/eloquent-mutators#date-mutators)。
  • 我以前没有遇到过。在一个应用程序中,我有许多日期字段。它们在迁移中被标记为可为空,并列在模型的日期数组中。这一切都可以正常工作,无需修改器。
  • 你可以试试\App\Yourmodel::find(7)->update(["your_date_field" => ""]); 吗?

标签: php laravel php-carbon


【解决方案1】:

深入研究一下:

5.4 中更新的中间件

Laravel 5.4 在默认的中间件堆栈中包含了两个新的中间件:TrimStringsConvertEmptyStringsToNull

这些中间件会自动修剪请求输入值和 将任何空字符串转换为null。这可以帮助您规范化 输入进入您的应用程序的每个请求,而不必 担心在每条路由中不断调用trim 函数,并且 控制器。

发件人:https://laravel.com/docs/5.4/releases#laravel-5.4

所以,当我抓取请求对象时,一个空的日期字段被转换为 null。数据库允许这些字段为 null 并且一切正常。

因此,通过前端,可以正确输入和删除日期字段。根据您的要求手动更新为空字符串时

\App\Yourmodel::find(7)->update(["your_date_field" => ""]);  

我遇到了同样的data missing 错误。

问题是,您是否特别需要传递一个空字符串,还是让该字段可以为空对您来说是一个更好的选择?

\App\Yourmodel::find(7)->update(["your_date_field" => null]);

【讨论】:

  • 现在一切都清楚了。我有一个来自前端的空字符串的原因是我将我的数据包装在 FormData 变量中以将文件上传到服务器。我尝试拆分文件和数据字段数据并将带有两个变量(数组+文件)的请求发送到服务器,但不幸的是我只得到了数组。 axios.post('/api/controller/update/' + this.id, {fd: formData, data: this.data})
猜你喜欢
  • 2016-04-30
  • 1970-01-01
  • 2019-02-22
  • 2018-02-02
  • 2021-05-09
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多