Laravel 5.5更新空日期字符串产生的数据缺少碳错误

问题描述:

对Laravel 5.5的更新似乎给我造成了一些古怪。可能是我搞砸了,但这些问题只与新版本打破 - 这个相同的代码没有在5.4,5.3等失败。更大的问题是,错误是不一致的在同一模型 - 它更新失败,但在商店工作。Laravel 5.5更新空日期字符串产生的数据缺少碳错误

我在'prog'模型上有一个名为'decom_date'的日期字段,模型上的$日期字段被覆盖以包含'decom_date'。用户可以填写新的“prog”表单,并跳过“decom_date”字段。该模型保存没有错误。如果用户编辑具有完全相同的形式相同的PROG模型,并离开“decom_date”字段留空,在Laravel 5.5出现以下错误只:

message "Data missing" 
exception "InvalidArgumentException" 
file "/var/www/ipfast/vendor/nesbot/carbon/src/Carbon/Carbon.php" 
line 582 

IE碳现在期待的格式,而不是一个空的字符串仅在更新时。我可以解决这一个突变基因的模型,像这样:

public function setDecomDateAttribute($value) 
{ 
    $this->attributes['decom_date'] = $value ?: null; 
} 

没问题 - 这工作,我认为将停止新的突破100%......但我担心当事情突然断裂,尤其是在整个保存过程中似乎并不一致。这种模式在我使用日期的每个模型中都一致地失败,并且在更新之前这些模式没有被破坏。

任何人都可以对此有所了解 - 或者可能只是我做过的一些愚蠢的事情?

我无法证实此行为。如果您的日期为空字符串,则无论是在更新还是创建过程中,它总是会失败并显示您发布的错误。

通常在Laravel 5.4和5.5全球中间件堆栈包含:

 \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, 

您可以在应用程序检查该\ HTTP \ Kernel.php

有了这个中间件emptry字符串建议立即进行删除自动转换为Carbons正确处理的NULL值。

我可以想象的是,当您在创建期间跳过此字段时,您的decom_date字段甚至不会出现在请求数据中(只需在存储方法的顶部使用dd($ request)进行检查即可)

如果在更新方法期间将字段留空,则结果为空字符串(如果上述中间件丢失......)

+0

非常感谢您的回答。正确 - 对于上面的中间件,Laravel应该自动将它们转换为null,并且我不应该有任何问题。我在L5.0中编写了应用程序,因此必须手动执行此操作,所以我不*使用中间件。 ,这不是我的问题,我相信以前版本字段不存在,但它现在在两个存储/更新方法中作为空字符串返回。可能是另一个LaravelCollective问题,但仍不能解释差异存储/更新。或者可能在$ request代码中有所改变。仍然没有快乐。 – Watercayman