我正在使用 Laravel 5.1
几天前,我在模型中使用 protected $dates = ['license_expire']
将字符串日期转换为 Carbon 实例。在 HTML 中,创建日期的默认值是 Carbon\Carbon::now()->format('Y-m-d')
为了在主页中显示警报,我使用了 <p>Licence Expired: <b>{{ $employee->license_expire < Carbon\Carbon::now()?'License has expired':$employee->license_expire->diffForHumans() }}</b></p>
直到那时 diffForHumans() 方法工作正常。
但在这种情况下,无论数据库中有什么,编辑表单的默认值也是今天的日期(我使用的是部分表单)。为了解决它,我将 HTML 中的默认值更改为 NUll。并在我的模型中添加另一种方法以在创建表单中显示当前日期。
public function getLicenseExpireAttribute($date)
{
return Carbon::parse($date)->format('Y-m-d');
}
之后,当我转到主页时,我有一个 FatalErrorException
上面写着 Call to a member function diffForHumans() on string
当我用 dd($employee->license_expire)
检查日期时,它再次变为 STRING。
谁能告诉我在这种情况下如何将字符串转换为碳?
或者
将创建表单的默认日期设置为今天的日期,从数据库中编辑表单的日期,我可以使用 diffForHumans() 在主页中显示警报?
原文由 smartrahat 发布,翻译遵循 CC BY-SA 4.0 许可协议
你快到了。
删除
protected $dates = ['license_expire']
然后将您的
LicenseExpire
访问器更改为:这样,无论如何它都会返回一个
Carbon
实例。因此,对于您的表单,您只需$employee->license_expire->format('Y-m-d')
(或所需的任何格式)和diffForHumans()
也应该在您的主页上工作。如果你使用 Laravel 9+,你也可以使用更新的语法来定义 Accessors :