对Laravel 5.5的更新似乎为我创造了一些奇怪的东西。可能是我搞砸了,但这些问题只是破坏了新版本 - 这个相同的代码在5.4,5.3等中没有失败。更大的问题是错误在同一模型上不一致 - 它在更新时失败,但在商店工作。
我在'prog'模型上有一个名为'decom_date'的日期字段,模型上的$ dates字段被覆盖以包含'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 Carbon现在期望在仅更新时使用格式而不是空字符串。我可以在模型上使用mutator来解决这个问题:
public function setDecomDateAttribute($value)
{
$this->attributes['decom_date'] = $value ?: null;
}
没问题 - 这是有效的,而且我认为会在100%的时候停止新的突破......但是当事情突然中断时我会担心,特别是因为它在保存期间似乎不一致。这种模式在每个模型中都与日期一致,并且在更新之前没有被破坏。
任何人都可以对此有所了解 - 或者只是我做过的一些蠢事?
答案 0 :(得分:0)
我无法确认此行为。如果您的日期是空字符串,则无论是在更新期间还是创建期间,它始终会因您发布的错误而失败。
通常在Laravel 5.4和5.5中,全局中间件堆栈包含:
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
您可以在app \ Http \ Kernel.php
中查看此内容使用此中间件,emptry字符串应自动转换为NULL值,Carbons可以正确处理。
我可以想象的是,当你跳过'跳过时,你的decom_date字段甚至不会出现在请求数据中。在创建期间使用此字段(只需在商店方法的基础上使用dd($ request)进行检查。
如果你离开现场,那么空白'在更新方法期间,结果是一个空字符串(如果上面提到的中间件丢失了......)